2016-06-15 16 views
6

Chúng tôi đã có một trải nghiệm gần đây với bash rằng ngay cả khi chúng tôi tìm thấy giải pháp, nó vẫn xoay quanh tâm trí của tôi. Làm cách nào để bash đánh giá biểu thức && về mã trả lại?Đánh giá hành vi mã thoát "&&" bash "

Thực thi kịch bản này, mà nên thất bại vì myrandomcommand không tồn tại:

#!/bin/bash 

set -e 

echo "foo" 
myrandomcommand 
echo "bar" 

Kết quả được mong đợi nhất:

~ > bash foo.sh 
foo 
foo.sh: line 6: myrandomcommand: command not found 
[exited with 127] 
~ > echo $? 
127 

Nhưng thay đổi một chút mã sử dụng biểu thức &&:

#!/bin/bash 

set -e 

echo "foo" 
myrandomcommand && ls 
echo "bar" 

Số ls ement không được thực hiện (kể từ khi tuyên bố đầu tiên thất bại và không đánh giá báo cáo kết quả thứ hai), nhưng kịch bản hoạt động rất khác nhau:

~ > bash foo.sh 
foo 
foo.sh: line 6: myrandomcommand: command not found 
bar     # ('bar' is printed now) 
~ > echo $? 
0 

Chúng tôi phát hiện ra rằng việc sử dụng khái niệm giữa ngoặc (myrandomcommand && ls) nó hoạt động như mong đợi (như ví dụ đầu tiên), nhưng tôi muốn biết tại sao.

+1

[BashFAQ # 105] (http://mywiki.wooledge.org/BashFAQ/105) có thể là một chi thú vị cho bạn – andlrc

Trả lời

7

Bạn có thể đọc trong các trang người đàn ông của bash:

-e Exit immediately if a simple command (see SHELL GRAMMAR above) exits with a 
    non-zero status. The shell does not exit if the command that fails is part of the 
    command list immediately following a while or until keyword, part of the test in 
    an if statement, part of a && or || list, or if the command's return value is being 
    inverted via !. A trap on ERR, if set, is executed before the shell exits. 
+3

Ngoài ra lý do nó làm việc trong parens, là toàn bộ subshell thất bại mà được tính là một lệnh trong shell đầu. – 123