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-saymã 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 $?)
sudolệnh thành công (nghĩa là, nếu sudothoá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 sudothành công
commandvà 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 sudonhư là một phần của bài kiểm tra cho phép sudoxóa bỏ sự trở lại của commandvị 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.