Câu hỏi Cái nào tốt hơn: sử dụng; hoặc && để thực hiện nhiều lệnh trong một dòng?


Trong hướng dẫn và làm thế nào để tôi thường thấy các lệnh kết hợp. Ví dụ,

sudo apt-get update && sudo apt-get install pyrenamer

Dường như có bốn kết nối có thể có: &, &&, || và ;. Thông qua &  kết nối là rõ ràng với tôi (nó sẽ gửi một quá trình để nền và lá thiết bị đầu cuối có sẵn), nó không phải là rõ ràng những gì là sự khác biệt giữa && và ;. Và tôi không biết || cho đến khi nhận xét của Kaya.

Các câu hỏi sau đây đối phó với sự khác biệt giữa hai đầu nối, nhưng làm như vậy chủ yếu trong các nhận xét:

Đây là một số câu hỏi liên quan:

  1. Sự khác biệt giữa ; và &&?
  2. Khi nào bạn nên sử dụng chúng tương ứng? Nó sẽ được tốt đẹp để xem một số trường hợp sử dụng: nếu tôi muốn chạy một lệnh và sau đó sau khi nó tắt máy tính của tôi, mà kết nối tôi nên chọn?
  3. Của họ là gì lợi thế và nguy hiểm? Robie Basak đề cập trong nhận xét câu trả lời này một lệnh như cd /somewhere_else; rm -Rf * có thể có hậu quả phá hoại nếu ví dụ, phần tử đầu tiên trong chuỗi lệnh không thành công.
  4. Nếu có liên quan, chúng đến từ đâu?

332
2017-08-20 16:41


gốc


Có một trình kết nối khác mà bạn có thể chưa gặp phải: ||giống như && ngoại trừ việc nó chỉ thực thi lệnh thứ hai nếu lệnh thứ nhất thoát ra với trạng thái khác không (không thành công). - Kaya
Cũng lưu ý rằng chạy tập lệnh của bạn với set -e sẽ ngừng tập lệnh về lỗi như thể tất cả các lệnh được kết nối với &&. - choroba
stackoverflow.com/questions/3573742/… - Ciro Santilli 新疆改造中心 六四事件 法轮功
Không ai trả lời Qn 4 ... Tôi nghi ngờ hành vi của && và || được lấy cảm hứng từ ngôn ngữ lập trình C. Trong trường hợp (x && y), nếu x đánh giá sai, toàn bộ biểu thức phải sai để trình biên dịch có thể tối ưu hóa việc đánh giá y, trong trường hợp nó đắt. Các tiêu chuẩn C và C ++ hiện đại thực sự yêu cầu tối ưu hóa này, vì vậy các chương trình có thể giả định rằng y sẽ không được đánh giá nếu x là sai. Ví dụ, (ptr && ptr-> days> 31) sẽ không sụp đổ ngay cả khi ptr là null. Cũng trong C, các câu lệnh kết thúc bằng; bất kể có một tuyên bố khác trên cùng một dòng hay không. - Kevin


Các câu trả lời:


Cheatsheet:

A; B    # Run A and then B, regardless of success of A
A && B  # Run B if and only if A succeeded
A || B  # Run B if and only if A failed
A &     # Run A in background.

608
2017-10-20 11:02



Và dĩ nhiên, A & B &: Chạy A ở chế độ nền, sau đó chạy B trong nền (bất kể thành công) và trả về điều khiển cho trình bao. Điều này thường hoạt động giống như chạy cả hai quy trình cùng một lúc. - Limited Atonement
là nó có thể nói: chạy một nền, tiếp theo là b trong nền chỉ khi một người làm việc? ( Tôi đoán &&& ?) - user230910
@ user230910: đó sẽ là (A && B) &. - leftaroundabout
Bạn có thể tham khảo tài liệu có thẩm quyền cho điều này không ?. - Jaime Hablutzel
@Jack Khi được thực hiện từ Cronjob, nó không hoàn toàn tuân theo quy tắc này, bất kỳ ý tưởng nào tại sao? Đối với tệp python - CodeGuru


&& chỉ chạy lệnh thứ hai nếu lệnh đầu tiên đã thoát với trạng thái 0 (đã thành công). ; chạy cả hai lệnh, ngay cả khi lệnh đầu tiên thoát với trạng thái khác 0.

Ví dụ của bạn với && có thể được diễn giải tương đương như

if sudo apt-get update ; then
    sudo apt-get install pyrenamer
fi

77
2017-08-20 16:46



Cảm ơn. Tôi đã cập nhật câu hỏi để đảm bảo các truy vấn con khác nhau dễ phân biệt. - don.joey
@Private: Bạn nên sử dụng ; nếu lệnh thứ hai không cần lệnh trước để thành công. - choroba


Sử dụng ; sẽ thực hiện các lệnh bất kể lệnh đầu tiên có thành công hay không.

sử dụng && thực thi lệnh thứ 2 chỉ khi lệnh đầu tiên được thực thi thành công (trạng thái 0).

Cả hai đều được sử dụng trên quan điểm khác nhau. Giống như cho một quá trình dài hơn, nói cho một cài đặt bạn cần phải biên dịch và cài đặt nó. bạn nên make && make install. Vì vậy, quá trình cài đặt sẽ chỉ chạy nếu make thành công.

Vì vậy, đối với các lệnh phụ thuộc bạn nên sử dụng &&

Wring bash, hoặc lệnh với các lệnh độc lập sử dụng ; 

Vì vậy, nếu bạn muốn tắt máy tính ngay cả khi công việc đầu tiên bị lỗi ; , nhưng nếu muốn thành công hoàn toàn của công việc đầu tiên bắt đầu sử dụng tắt máy &&


28
2017-08-20 16:50



Cảm ơn. Tôi thích trường hợp sử dụng cuối cùng mà bạn trình bày. Tôi đã cập nhật câu hỏi. - don.joey


a ; b sẽ chạy b bất kể trạng thái thoát của a. a && b sẽ chạy b chỉ khi đã thành công.

Điều này là cần thiết và đủ để trả lời cho 3 câu hỏi đầu tiên. Đặc biệt, 2 là quá rộng, và không thể được trả lời "một" dứt khoát - đặt cược tốt nhất của bạn là quyết định từng trường hợp cụ thể.

Đối với câu hỏi thứ 4: Chúng là cú pháp Bash.

Không có nguy hiểm bên trong khi sử dụng. Một lần nữa, định nghĩa trên là đủ. Nó ngụ ý rằng bạn sẽ viết && khi nào b có tác dụng không mong muốn nếu a không thành công. Không cần các quy tắc hoặc giải thích thêm, IMHO.


13
2017-08-20 21:05