Thoát mã khi gọi R script từ bash

Sep 15 2020

Tôi có một tập lệnh R mà tôi gọi từ một trình bao tương tác (MacOS Catalina). Đây là một trong một loạt các tập lệnh mà tôi gọi từ trình bao tương tác, vì vậy tôi cần biết nếu tập lệnh ban đầu bị lỗi. Có vẻ như bất kể tập lệnh bị lỗi như thế nào (khẳng định_that, dừng lại, dừng lại, thoát), R luôn trả về trạng thái thoát bằng 0. Làm cách nào để trả về trạng thái tồn tại khác 0 từ tập lệnh R bị lỗi?

Đây là một tập lệnh R ví dụ (fail.r).

#!/usr/bin/env Rscript

#library(assertthat)

message("Starting script")

#assert_that(FALSE)

#stop('Fail')

#stopifnot(FALSE)

q(save="no", status=10, runLast=FALSE)

message("Should not reach here")

Và đây là cách tôi có thể gọi nó từ lời nhắc bash

src/poc/fail.r

echo $?

Bất kể phương pháp tôi sử dụng để thoát khỏi tập lệnh R $ là gì? luôn trả về 0.

Một số bài đăng khác giải quyết vấn đề này, nhưng dường như không áp dụng cho trường hợp của tôi ( Cách lấy Rscript để trả về mã trạng thái ở chế độ bash không tương tác ) và ( Làm cho R thoát với mã trạng thái khác 0 )

Trả lời

1 TimurShtatland Sep 14 2020 at 23:36

Tôi có thể đưa trạng thái từ Rscript trở lại trình bao gọi (R phiên bản 4.0.2, phiên bản bash 3.2.57 hoặc zsh phiên bản 5.8 chạy trên MacBook Pro, macOS Mohave 10.14.6) bằng cách sử dụng q(status = N). Để có trạng thái thoát khác 0 từ tập lệnh R bị lỗi, hãy sử dụng q(status = 2)hoặc cao hơn, hãy xem quit:

$ Rscript -e 'q(status = 0);' $ echo $? 0 $ Rscript -e 'q(status = 2);'
$ echo $?
2

$ Rscript -e 'q(status = 10);' $ echo $? 10 $ R --version
R version 4.0.2 (2020-06-22) -- "Taking Off Again"
Copyright (C) 2020 The R Foundation for Statistical Computing
Platform: x86_64-apple-darwin13.4.0 (64-bit)

$ bash --version GNU bash, version 3.2.57(1)-release (x86_64-apple-darwin18) $ zsh --version
zsh 5.8 (x86_64-apple-darwin17.7.0)

Sử dụng một tập lệnh về cơ bản giống với tập lệnh mà bạn đã đăng, tôi nhận được kết quả mong đợi (trạng thái từ quitđược chuyển thành công sang trình bao kèm theo):

Kịch bản:

#!/usr/bin/env Rscript

message("Starting script")
## Use status = 0, 2 or 10:
q(save = "no", status = 2, runLast = FALSE)
message("Should not reach here")

Đầu ra (thử nghiệm với các phiên bản zsh và bash được hiển thị ở trên):

$ ~/test/test1.r Starting script $ echo $? 0 $ ~/test/test1.r
Starting script
$ echo $?       
2
$ ~/test/test1.r Starting script $ echo $?       
10

XEM THÊM:

Một số giá trị trạng thái lỗi được sử dụng bởi chính R. Trình xử lý lỗi mặc định cho việc sử dụng không tương tác hiệu quả gọi q ("không", 1, FALSE) và trả về trạng thái lỗi 1. Trạng thái lỗi 2 được sử dụng cho R 'tự sát', đó là lỗi nghiêm trọng và các số nhỏ khác được sử dụng bởi các cổng cụ thể cho các lỗi khởi tạo. Người dùng nên chọn trạng thái từ 10 trở lên.

Giá trị hợp lệ của trạng thái phụ thuộc vào hệ thống, nhưng 0: 255 thường hợp lệ.

(Từ quittài liệu)