Vâng, có một sự khác biệt lớn. &&
là ngắn mạch , do đó lệnh tiếp theo sẽ chỉ được thực hiện nếu lệnh trước đó được trả về với mã thoát là 0
.
Trích dẫn từ hướng dẫn :
biểu &&
thức1 biểu thức2
True if both expression1 and expression2 are true.
Mặt khác, một tập lệnh chứa
expression1
expression2
sẽ thực hiện biểu thức thứ hai ngay cả khi lần đầu tiên thất bại. (Trừ khi bạn chỉ định tập lệnh thoát khỏi lỗi bằng cách nói set -e
.)
EDIT: Về nhận xét của bạn cho dù:
command1; command2
giống như:
command1
command2
Câu trả lời thường là . Bash phân tích toàn bộ khối lệnh trước khi đánh giá bất kỳ khối nào. A; không làm cho lệnh trước được đánh giá. Nếu lệnh trước đó có ảnh hưởng đến cách lệnh tiếp theo sẽ được phân tích cú pháp, thì bạn sẽ nhận thấy sự khác biệt.
Hãy xem xét một tệp có chứa bí danh, hãy gọi nó alias
, với một mục:
alias f="echo foo"
Bây giờ hãy xem xét một tập lệnh chứa:
shopt -s expand_aliases
source ./alias
f
và một cái khác có chứa:
shopt -s expand_aliases; source ./alias; f
sau đó bạn có thể nghĩ rằng cả hai sẽ tạo ra cùng một đầu ra.
Câu trả lời là không. Người đầu tiên sẽ sản xuất foo
nhưng người thứ hai sẽ báo cáo:
... f: command not found
Để làm rõ hơn, nó không expand_aliases
gây ra vấn đề. Vấn đề là do một tuyên bố như:
alias f="echo foo"; f
sẽ được phân tích cú pháp trong một lần. Shell không thực sự biết nó f
là gì , điều này làm cho trình phân tích cú pháp bị sặc.