dòng lệnh - mục đích của là &&
gì?
Trong vỏ, khi bạn nhìn thấy
$ command one && command two
mục đích là để thực hiện lệnh theo sau &&
chỉ khi lệnh đầu tiên thành công. Đây là thành ngữ của vỏ Posix và không chỉ được tìm thấy ở Bash.
Nó có ý định ngăn chặn quá trình chạy thứ hai nếu lần đầu tiên thất bại.
Bạn có thể nhận thấy tôi đã sử dụng từ "ý định" - đó là lý do chính đáng. Không phải tất cả các chương trình đều có cùng một hành vi, vì vậy để điều này hoạt động, bạn cần hiểu chương trình coi "lỗi" là gì và cách nó xử lý nó bằng cách đọc tài liệu và, nếu cần, mã nguồn.
Shell của bạn coi giá trị trả về là 0 là true, các số dương khác là false
Các chương trình trả lại một tín hiệu về thoát. Họ sẽ trả về 0 nếu thoát thành công hoặc lớn hơn 0 nếu không. Điều này cho phép một lượng giao tiếp hạn chế giữa các quy trình.
Cái &&
này được gọi là AND_IF
trong ngữ pháp shell posix , là một phần của and_or
danh sách các lệnh, cũng bao gồm cái ||
có OR_IF
ngữ nghĩa tương tự.
Biểu tượng ngữ pháp, trích dẫn từ tài liệu:
%token AND_IF OR_IF DSEMI
/* '&&' '||' ';;' */
Và Ngữ pháp (cũng được trích dẫn từ tài liệu), cho thấy rằng bất kỳ số AND_IF
s ( &&
) và / hoặc OR_IF
s ( ||
) nào cũng có thể được xâu chuỗi lại với nhau (như and_or
được định nghĩa đệ quy):
and_or : pipeline
| and_or AND_IF linebreak pipeline
| and_or OR_IF linebreak pipeline
Cả hai toán tử đều có quyền ưu tiên như nhau và được đánh giá từ trái sang phải (chúng là liên kết trái). Như các tài liệu nói:
Một AND-OR
danh sách là một chuỗi gồm một hoặc nhiều đường ống được phân tách bởi các toán tử "&&"
và "||"
.
Một danh sách là một chuỗi của một hoặc nhiều AND-OR danh sách được phân cách bởi các nhà khai thác ';'
và '&'
và tùy chọn chấm dứt bởi ';'
, '&'
hoặc.
Các toán tử "&&"
và "||"
sẽ có quyền ưu tiên như nhau và sẽ được đánh giá với tính kết hợp trái. Ví dụ, cả hai lệnh sau chỉ ghi thanh vào đầu ra tiêu chuẩn:
$ false && echo foo || echo bar
$ true || echo foo && echo bar
Trong trường hợp đầu tiên, false là một lệnh thoát với trạng thái 1
$ false
$ echo $?
1
có nghĩa là echo foo
không chạy (tức là shortcircuiting echo foo
). Sau đó, lệnh echo bar
được thực thi.
Trong trường hợp thứ hai, lối thoát thực sự với mã 0
$ true
$ echo $?
0
và do đó echo foo
không được thực thi, sau đó echo bar
được thực thi.
false && echo "Will not be printed"
.