Sự khác biệt giữa && và; Khi ngủ ngủ để làm nền?


8

Tôi vừa hỏi một câu hỏi về việc từ bỏ một quá trình để ngủ trong backgroud.
Ký hiệu tôi nghĩ ra với chính mình trông như thế này:

sleep 10 && echo "hello world" &

Câu trả lời này cho một câu hỏi khác nhau sử dụng một định dạng khác nhau.

( sleep 10 ; echo "hello world" ) &

Tôi biết rằng &&chỉ cho phép quá trình thứ hai bắt đầu nếu quá trình đầu tiên trả về đúng. Ngủ có được không? Có một tình huống mà tôi nên thích cái này hơn cái kia không?


Câu trả lời:


12

Giấc ngủ có thể thất bại nếu nó bị chấm dứt trong khi thực hiện:

$ sleep 2
$ echo "$?"
0
$ sleep 2
^C
$ echo "$?"
130

Vì giấc ngủ là một thực thi bên ngoài, nên cũng có thể hiểu rằng các lệnh gọi fork hoặc exec có thể không thành công, điều này cũng sẽ khiến bash tạo mã lỗi> 0.


5

a; bluôn luôn chạy lệnh thứ hai sau lệnh thứ nhất, trong khi chỉ a && bchạy lệnh thứ hai nếu lệnh thứ nhất thành công, tức là chỉ khi lệnh thứ nhất trả về trạng thái 0.

sleepluôn trả về trạng thái 0, trừ khi nó bị tín hiệu giết, trong trường hợp đó trạng thái là số tín hiệu 128 +. (Trạng thái cũng có thể là 126 hoặc 127 nếu sleeplệnh không tồn tại hoặc chương trình không thể khởi động do thiếu tài nguyên, nhưng bạn rất khó gặp phải những trường hợp này.)

Do đó, bạn nên sử dụng ;hoặc &&tùy thuộc vào những gì bạn muốn xảy ra nếu giấc ngủ bị gián đoạn:

  • sleep 10; echo helloin tin nhắn sau 10 giây (ít hơn nếu sleepbị giết bởi tín hiệu);
  • sleep 10 && echo helloin tin nhắn sau 10 giây, nhưng không in gì nếu sleepbị giết bởi tín hiệu.

3

Bạn nên cho rằng bất kỳ lệnh nào cũng có thể thất bại vì nhiều lý do ngay cả khi ngủ không thực sự rất khó xảy ra.

( sleep 10 ; echo "hello world" ) &

phương tiện nền giấc ngủ và thực hiện tiếng vang sau khi quá trình ngủ nhưng nếu ngủ không tiếng vang sẽ chạy anyway thấy giải thích đầy đủ

sleep 10 && echo "hello world" &

có nghĩa là bạn cần đợi kết thúc giấc ngủ trước khi lặp lại bất cứ điều gì và nếu tiếng vang không thành công thì quá trình dừng lại nhưng toàn bộ lệnh cũng được làm nền. xem giải thích đầy đủ

Kết luận
cú pháp đầu tiên là shell script có nghĩa là nó xem xét các hướng dẫn riêng biệt như một danh sách.
Tùy chọn thứ hai sử dụng && có nghĩa là VÀ vì vậy nếu bạn sử dụng nó thì lệnh thứ nhất không thành công, lệnh thứ hai sẽ không được thực thi.

Đây chỉ là hành vi khác nhau trong việc xử lý lỗi.


@terdon Cảm ơn bạn đã chỉnh sửa, bài viết của tôi thực sự được viết rất khủng khiếp
Kiwy
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.