Apa perbedaan antara && dan; kapan forking tidur ke latar belakang?

8

Saya baru saja mengajukan pertanyaan tentang proses forking tidur di backgroud.
Notasi yang saya kemukakan terlihat seperti ini:

sleep 10 && echo "hello world" &

Jawaban untuk pertanyaan yang berbeda ini menggunakan format yang berbeda.

( sleep 10 ; echo "hello world" ) &

Saya tahu itu &&hanya memungkinkan proses kedua untuk memulai jika yang pertama mengembalikan true. Bisakah tidur gagal? Apakah ada situasi di mana saya harus lebih suka yang satu daripada yang lain?

Baarn
sumber

Jawaban:

12

Tidur dapat gagal jika diakhiri selama eksekusi:

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

Karena sleep adalah executable eksternal, dapat dipastikan bahwa fork atau exec panggilan bisa gagal, yang juga akan menyebabkan bash menghasilkan kode kesalahan> 0.

Chris Down
sumber
5

a; bselalu menjalankan perintah kedua setelah yang pertama, sedangkan a && bmenjalankan perintah kedua hanya jika yang pertama berhasil, yaitu hanya jika perintah pertama mengembalikan status 0.

sleepselalu mengembalikan status 0, kecuali ketika terbunuh oleh sinyal, dalam hal ini statusnya 128 + nomor sinyal. (Statusnya juga bisa 126 atau 127 jika sleepperintah tidak ada atau program tidak dapat memulai karena kurangnya sumber daya, tetapi Anda sangat tidak mungkin menemukan kasus ini.)

Dengan demikian, Anda harus menggunakan ;atau &&bergantung pada apa yang Anda inginkan terjadi jika tidur terganggu:

  • sleep 10; echo hellomencetak pesan setelah 10 detik (lebih sedikit jika sleepterbunuh oleh sinyal);
  • sleep 10 && echo hellomencetak pesan setelah 10 detik, tetapi tidak mencetak apa pun jika sleepterbunuh oleh sinyal.
Gilles 'SANGAT berhenti menjadi jahat'
sumber
3

Anda harus berasumsi bahwa perintah apa pun dapat gagal karena berbagai alasan bahkan jika mengalami kegagalan tidur memang sangat tidak mungkin.

( sleep 10 ; echo "hello world" ) &

berarti tidur latar belakang dan menjalankan gema setelah proses tidur tetapi jika tidur gagal gema akan tetap berjalan lihat penjelasan lengkap

sleep 10 && echo "hello world" &

berarti Anda harus menunggu akhir tidur sebelum menggemakan apa pun dan jika gema gagal proses berhenti tetapi seluruh perintah juga dilatar belakangi. lihat penjelasan lengkap

Kesimpulan
sintaks pertama adalah skrip shell yang berarti itu mempertimbangkan instruksi secara terpisah sebagai daftar.
Opsi kedua menggunakan && berarti DAN jadi jika Anda menggunakannya dari perintah pertama gagal maka yang kedua tidak akan dieksekusi.

Ini hanya perilaku yang berbeda dalam menangani kesalahan.

Kiwy
sumber
@terdon Terima kasih atas hasil editnya, Posting saya memang sangat ditulis
Kiwy