Lý do sử dụng && thay vì; để đặt lệnh trên cùng một dòng?


30

Không phải là một chuyên gia trong cả Linux không phải Unix Tôi đang tự hỏi sự khác biệt giữa 2 phương thức xâu chuỗi 2 lệnh này trên cùng một dòng là gì? Tôi thấy không có sự khác biệt về đầu ra trong ví dụ đơn giản này

Pete$date ; time
Sun Mar 17 19:37:20 EDT 2013

real    0m0.000s
user    0m0.000s
sys 0m0.000s

Pete$date &&time
Sun Mar 17 19:37:46 EDT 2013

real    0m0.000s
user    0m0.000s
sys 0m0.000s

Điều này đã không gây ra bất kỳ vấn đề - tôi chỉ tò mò ..

Câu trả lời:


43

&&là một logic 'và'. Đối số đầu tiên được ước tính và đối số thứ hai chỉ được ước tính nếu đối số thứ nhất trả về đúng. Lý do là "sai VÀ một cái gì đó" luôn luôn sai, vì vậy không cần phải đánh giá đối số thứ hai trong trường hợp này.

Vì vậy, sử dụng &&bạn đảm bảo rằng lệnh thứ hai không được thực thi nếu lệnh đầu tiên báo lỗi ( trueđược biểu thị bằng mã thoát 0, điều này cho biết rằng không có lỗi). Ngược lại, ;thực thi cả hai lệnh, bất kể kết quả của lệnh đầu tiên là gì.

Kết luận: Chuỗi lệnh với &&là một thói quen tốt. Ngược lại, ;nó sẽ không thực thi các lệnh tiếp theo nếu có lỗi xảy ra.


bạn có nghĩa là điều đó 0có nghĩa truehay điều đó 0có nghĩa là đúng - có lỗi không?
Michael Butler

1
@MichaelButler: 0có nghĩa là true. Tôi đã thêm một sự làm rõ.
azimut

26

;

Tuần tự thực hiện các lệnh, bất kể trạng thái thoát trước đó là gì:

# sh -c "exit 0" ; echo "2nd command"
2nd command
# sh -c "exit 1" ; echo "2nd command"
2nd command

&&

Logic VÀ

Thực hiện lệnh tiếp theo, nhưng chỉ khi lệnh trước thành công (trạng thái thoát là 0):

# sh -c "exit 0" && echo "2nd command"
2nd command
# sh -c "exit 1" && echo "2nd command"
#

| |

Hợp lý HOẶC

Thực hiện lệnh tiếp theo, nhưng chỉ khi lệnh trước đó không thành công (trạng thái thoát không 0 ):

# sh -c "exit 0" || echo "2nd command"
#
# sh -c "exit 1" || echo "2nd command"
2nd command

6
Ngoài ra, sh -c "exit 0"có thể được thay thế bằng truetrong các ví dụ này, và sh -c "exit 1"với false.
Flimm
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.