Pertanyaan Mana yang lebih baik: menggunakan; atau && untuk menjalankan beberapa perintah dalam satu baris?


Dalam tutorial dan bagaimana saya sering melihat perintah digabungkan. Contohnya,

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

Tampaknya ada empat konektor yang mungkin: &, &&, || dan ;. Meskipun &  konektor jelas bagi saya (mengirim proses ke latar belakang dan meninggalkan terminal yang tersedia), tidak jelas apa perbedaannya && dan ;. Dan saya tidak tahu || sampai komentar Kaya.

Pertanyaan berikut berhubungan dengan perbedaan antara dua konektor, tetapi kebanyakan dilakukan di komentar:

Jadi di sini ada sejumlah pertanyaan terkait:

  1. Apa perbedaan antara ; dan &&?
  2. Kapan Anda menggunakannya masing-masing? Akan menyenangkan untuk melihat beberapa kasus penggunaan: jika saya ingin menjalankan perintah dan kemudian setelah mematikan komputer saya, konektor mana yang harus saya pilih?
  3. Apa mereka keuntungan dan bahaya? Robie Basak menyebutkan dalam komentar untuk jawaban ini bahwa perintah seperti cd /somewhere_else; rm -Rf * dapat memiliki konsekuensi destruktif jika elemen pertama dalam rantai perintah gagal, misalnya.
  4. Jika relevan, dari mana mereka berasal?

331
2017-08-20 16:41


asal


Ada konektor lain yang mungkin tidak Anda temui: ||sama dengan && kecuali bahwa ia hanya mengeksekusi perintah kedua jika yang pertama keluar dengan status tidak nol (tidak berhasil). - Kaya
Juga perhatikan bahwa menjalankan skrip Anda dengan set -e akan menghentikan skrip pada kegagalan seolah-olah semua perintah terhubung &&. - choroba
stackoverflow.com/questions/3573742/… - Ciro Santilli 新疆改造中心 六四事件 法轮功
Tidak ada yang menjawab Qn 4 ... Saya menduga perilaku && dan || terinspirasi oleh bahasa pemrograman C. Dalam kasus (x && y), jika x bernilai false, seluruh ekspresi harus salah, sehingga kompilator dapat mengoptimalkan evaluasi y, jika mahal. Standar C dan C ++ yang sebenarnya memerlukan optimasi ini, sehingga program dapat dengan aman berasumsi bahwa y tidak akan dievaluasi jika x salah. Sebagai contoh, (ptr && ptr-> hari> 31) tidak akan crash walaupun ptr bernilai null. Juga di C, pernyataan diakhiri dengan; terlepas dari apakah ada pernyataan lain pada baris yang sama atau tidak. - Kevin


Jawaban:


Contekan:

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.

606
2017-10-20 11:02



Dan tentu saja, A & B &: Jalankan A di latar belakang, lalu jalankan B di latar belakang (terlepas dari keberhasilan) dan kembalikan kontrol ke shell. Ini sering bekerja hampir sama dengan menjalankan kedua proses pada saat yang bersamaan. - Limited Atonement
apakah mungkin untuk mengatakan: menjalankan latar belakang, diikuti oleh b di latar belakang hanya jika bekerja? ( Saya kira &&& ?) - user230910
@ user230910: itu akan terjadi (A && B) &. - leftaroundabout
Dapatkah Anda mereferensikan dokumen resmi untuk ini? - Jaime Hablutzel
@Jack Ketika dieksekusi dari Cronjob, itu tidak cukup mengikuti aturan ini, tahu mengapa? Untuk file python - CodeGuru


&& hanya menjalankan perintah kedua jika yang pertama keluar dengan status 0 (berhasil). ; menjalankan kedua perintah, bahkan jika yang pertama keluar dengan status bukan nol.

Contoh Anda dengan && dapat diwakili secara ekivalen sebagai

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

77
2017-08-20 16:46



Terima kasih. Saya telah memperbarui pertanyaan untuk memastikan berbagai pertanyaan yang berbeda dapat dibedakan dengan mudah. - don.joey
@Private: Anda harus menggunakan ; jika perintah kedua tidak membutuhkan yang sebelumnya untuk berhasil. - choroba


Menggunakan ; akan menjalankan perintah terlepas apakah perintah pertama berhasil atau tidak.

menggunakan && mengeksekusi perintah 2 hanya ketika perintah pertama berhasil dijalankan (status 0).

Keduanya digunakan pada perspektif yang berbeda. Seperti untuk proses yang lebih lama, katakanlah untuk instalasi Anda perlu mengkompilasi dan menginstalnya. kamu harus make && make install. Jadi penginstalan hanya akan berjalan jika make sukses.

Jadi untuk perintah tergantung yang harus Anda gunakan &&

Wring bash, atau perintah dengan menggunakan perintah independen ; 

Jadi jika Anda ingin mematikan komputer bahkan pekerjaan pertama gagal digunakan ; , tetapi jika ingin pada keberhasilan penuh pekerjaan pertama memulai penggunaan shutdown &&


28
2017-08-20 16:50



Terima kasih. Saya suka kasus penggunaan terakhir yang Anda berikan. Saya telah memperbarui pertanyaannya. - don.joey


a ; b akan menjalankan b tanpa menghiraukan status keluar dari a. a && b akan dijalankan b hanya jika berhasil.

Ini perlu dan cukup untuk menjawab 3 pertanyaan pertama. Secara khusus, 2 terlalu luas, dan tidak dapat diberikan jawaban pasti "satu" - taruhan terbaik Anda adalah memutuskan berdasarkan kasus per kasus.

Adapun pertanyaan ke-4: Mereka sintaks Bash.

Tidak ada bahaya intrinsik dalam menggunakan keduanya. Sekali lagi, definisi di atas sudah cukup. Itu menyiratkan bahwa Anda akan menulis && kapan b memiliki efek yang tidak diinginkan jika a tidak berhasil. Tidak perlu ada aturan atau penjelasan lebih lanjut, IMHO.


13
2017-08-20 21:05