Có sự khác biệt giữa cách hai ký hiệu và dấu chấm phẩy hoạt động trong bash không?


71

Nếu tôi muốn chạy hai lệnh riêng biệt trên một dòng, tôi có thể làm điều này:

cd /home; ls -al

hoặc này:

cd /home && ls -al

Và tôi nhận được kết quả tương tự. Tuy nhiên, điều gì đang xảy ra trong nền với hai phương pháp này? Sự khác biệt chức năng giữa chúng là gì?

Câu trả lời:


88

Chỉ ;cần tách một lệnh từ một lệnh khác. Các &&nói chỉ chạy lệnh sau nếu trước đó đã thành công

cd /home; ls -al

Điều này sẽ cd /homevà ngay cả khi cdlệnh thất bại ( /homekhông tồn tại, bạn không có quyền truy cập nó, v.v.), nó sẽ chạy ls -al.

cd /home && ls -al

Điều này sẽ chỉ chạy ls -alnếu cd /homethành công.


2
sử dụng ; là một thực sự nguy hiểm (ít nhất là với lệnh rm), ví dụ cd /some/dir; rm -fr ./*. Vì vậy, với hoạt động phá hoại như vậy, bạn phải chắc chắn rằng bạn đang ở đúng nơi trước khi thực hiện rm. Lệnh đúng làcd /some/dir && rm -fr ./*
ALex_hha

70
a && b

nếu a trả về mã thoát không, thì b được thực thi.

a || b

nếu a trả về mã thoát khác không, thì b được thực thi.

a ; b

a được thực thi và sau đó b được thực thi.


16
cd /fakedir; ls -al

Chạy lstrong thư mục hiện tại vì cd /fakedirsẽ thất bại và shell sẽ bỏ qua trạng thái thoát không bằng không.

cd /fakedir && ls -al

Bởi vì &&toán tử sẽ chỉ tiếp tục nếu lệnh trước đó thoát bình thường (trạng thái bằng 0), lssẽ không có thao tác nào được thực hiện.

Có các toán tử khác, chẳng hạn như &sẽ tạo nền cho một quá trình. Mặc dù thường được đặt ở cuối lệnh, nó có thể được đặt ở giữa chuỗi.


4

Bạn cũng có thể nối chúng lại với nhau như một if..then..elsechuỗi lệnh logic.

thí dụ:

ls file.ext && echo "file exists" || echo "file does not exist"
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.