Bash / sh - sự khác biệt giữa && và;


136

Tôi thường sử dụng ;để kết hợp nhiều hơn một lệnh trong một dòng, nhưng một số người thích &&. Có sự khác biệt nào không? Ví dụ, cd ~; cd -cd ~ && cd -dường như để làm điều tương tự. Phiên bản nào dễ mang theo hơn, ví dụ như sẽ được hỗ trợ bởi một tập hợp con bash như vỏ của Android hay sao?

Câu trả lời:


193

Nếu lệnh trước thất bại với ;lệnh thứ hai sẽ chạy.

Nhưng với &&cái thứ hai sẽ không chạy.

Đây là một toán hạng "AND" logic "lười biếng" giữa các hoạt động.


2
Nói cách khác, nó có một hành vi ngắn mạch
peterchaula

@peter cái nào? Các ;một hay &&một? Hay bạn có nghĩa là cả hai?
Shaya

@ Shaya, cái &&.
peterchaula

57

Tôi đang sử dụng &&bởi vì một thời gian dài trước đây tại máy tính gần đó:

root# pwd
/
root# cd /tnp/test; rm -rf *
cd: /tnp/test: No such file or directory
...
... and after a while ...
...   
^C

nhưng không được giúp đỡ ...;)

cd /tnp/test && rm -rf * là an toàn ...;)


26
Để an toàn hơn, tôi sẽ sử dụngrm -rf /tnp/test
melvynkim

5
Để an toàn hơn nữa, tốt hơn hết là sử dụng rm /tnp/test/ -rfđể ngăn chặn lỗi nhập sai
radrow

22

Trong cmd1 && cmd2, cmd2chỉ được thực hiện nếucmd1 thành công (trả về 0).

Trong cmd1 ; cmd2, cmd2được thực hiện trong mọi trường hợp.

Cả hai cấu trúc là một phần của lớp vỏ tuân thủ POSIX.


11

&&có nghĩa là thực thi lệnh tiếp theo nếu trước đó đã thoát với trạng thái 0. Đối với ngược lại, sử dụng ||tức là được thực thi nếu lệnh trước đó thoát với trạng thái không bằng 0 ;thực thi luôn.

Rất hữu ích khi bạn cần thực hiện một hành động cụ thể tùy thuộc vào việc lệnh trước đó đã hoàn thành hay chưa.


5

Các lệnh tách biệt bởi ; được thực hiện tuần tự bất kể trạng thái hoàn thành của chúng.

Với &&, lệnh thứ hai chỉ được thực hiện nếu lệnh đầu tiên hoàn thành thành công (trả về trạng thái thoát là 0).

Điều này được bao phủ trong trang web bash dưới Lists. Tôi hy vọng bất kỳ shell nào giống Unix sẽ hỗ trợ cả hai nhà khai thác này, nhưng tôi không biết cụ thể về shell Android.


2
Dưới đây là một liên kết đến hướng dẫn bash: gnu.org/software/bash/manual/bashref.html#Lists
glenn Jackman

3

&&cho phép thực hiện có điều kiện trong khi ;luôn có lệnh thứ hai được thực thi.

Trong ví dụ command1 && command2, command2sẽ chỉ thực thi khi command1đã kết thúc exit 0, báo hiệu tất cả đều ổn, trong khi trong command1 ; command2lệnh thứ hai sẽ luôn được thực thi bất kể kết quả là gì command1.


1

&& là logic VÀ trong bash. Bash đã đánh giá ngắn mạch logic VÀ. Thành ngữ này là một cách đơn giản hơn để diễn đạt như sau:


cmd1;rc=$?
if [ $rc -eq 0 ]; then
   cmd2
fi

Trong khi ; phiên bản chỉ đơn thuần là:


cmd1
cmd2
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.