Có thể giữ trạng thái thoát lệnh cuối cùng ( $?
) không bị thay đổi sau khi kiểm tra không?
Ví dụ, tôi muốn làm:
command -p sudo ...
[ $? -ne 1 ] && exit $?
Cái cuối cùng exit $?
sẽ trả về trạng thái thoát sudo, nhưng thay vào đó nó luôn trả về 0
(mã thoát của kiểm tra).
Có thể làm điều đó mà không có một biến tạm thời?
Một ví dụ khác để làm rõ hơn:
spd-say "$@"
[ $? -ne 127 ] && exit $?
Trong trường hợp này tôi chỉ muốn thoát nếu lệnh đầu tiên được tìm thấy (mã thoát! = 127
). Và tôi muốn thoát với spd-say
mã thoát thực tế (nó có thể không
0
).
EDIT: Tôi quên đề cập rằng tôi thích giải pháp khiếu nại POSIX để có tính di động tốt hơn.
Tôi sử dụng cấu trúc này trong các tập lệnh mà tôi muốn cung cấp các lựa chọn thay thế cho cùng một lệnh. Ví dụ, xem tập lệnh crc32 của tôi .
Vấn đề với các biến tạm thời là chúng có thể che khuất các biến khác và để tránh việc bạn phải sử dụng tên dài, điều này không tốt cho khả năng đọc mã.
[ $? -ne 127 ] && exit $?
)
sudo
lệnh thành công (nghĩa là, nếu sudo
thoát với trạng thái 0). Nhưng, trong mã của bạn, tập lệnh sẽ tiếp tục chạy (không thoát) nếu sudo
thành công
command
và hoàn toàn không sudo
. Đó là ý nghĩa của việc tôi muốn thoát chỉ khi tìm thấy lệnh đầu tiên (mã thoát! = 127) và là một trả về được chỉ địnhcommand
khi không tìm thấy lệnh mà nó gọi. Tôi đoán vấn đề là việc gọi sudo
như là một phần của bài kiểm tra cho phép sudo
xóa bỏ sự trở lại của command
vị trí đầu tiên và do đó làm sai lệch bài kiểm tra.
if ! command -p sudo; then exit; fi
đó sẽ có kết quả tương tự cho ví dụ của bạn.