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_IFtrong ngữ pháp shell posix , là một phần của and_ordanh sách các lệnh, cũng bao gồm cái ||có OR_IFngữ 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_IFs ( &&) và / hoặc OR_IFs ( ||) 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-ORdanh 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 fookhô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 fookhông được thực thi, sau đó echo barđược thực thi.
false && echo "Will not be printed".