Apa perbedaan antara double-ampersand (&&) dan titik koma (;) di Linux Bash?

112

Apa perbedaan antara ampersand dan titik koma di Linux Bash ?

Sebagai contoh,

$ command1 && command2

vs.

$ command1; command2
Steve K
sumber
6
Saya menjawab ini di sini: superuser.com/a/619019/107862
Etan Reisner
9
Mengenai di luar topik, terakhir kali saya periksa, bash masih bahasa pemrograman, tetapi saya salah sebelumnya dan itu bisa berupa permen buah kering.
Steve K
Ya, dan jika Anda mengajukan pertanyaan tentang perilaku tertentu atau cara yang benar untuk melakukan hal tertentu, itu pasti sesuai topiknya. Ini termasuk dalam kategori abu-abu dari "pertanyaan tentang sintaksis bahasa" yang tidak sejelas pertanyaan "pemrograman" sejauh yang saya ketahui.
Etan Reisner
4
bash dalam beberapa hal kering, dan dalam beberapa hal manis. Pada akhirnya itu cukup menyenangkan dan mudah dicerna. Bagaimanapun, itu tidak dapat dengan mudah dicuri dari bayi.
code_monk

Jawaban:

139

The &&operator adalah boolean operator AND: jika sisi kiri mengembalikan status non-nol keluar, operator pengembalian yang status dan tidak mengevaluasi sisi kanan (pendek-sirkuit), jika tidak mengevaluasi sisi kanan dan mengembalikan status keluar nya . Ini biasanya digunakan untuk memastikan bahwa command2hanya dijalankan jika command1berhasil dijalankan.

The ;Token hanya memisahkan perintah, sehingga akan menjalankan perintah kedua terlepas dari apakah atau tidak yang pertama berhasil.

cdhowie.dll
sumber
6
apakah ampersand ganda &&berbeda dari satu ampersand &di bash?
Charlie Parker
16
@CharlieParker &menyebabkan perintah dijalankan di latar belakang, jadi ya. "Jalankan ini di latar belakang" sangat berbeda dengan "jalankan perintah berikut ini hanya jika yang lain ini berhasil."
cdhowie
Perintah2 hanya akan menjalankan perintah1 mengembalikan status keluar nol , artinya selesai dengan sukses ..
Nik
Apakah ;masih menunggu perintah pertama selesai?
rfii
@rfii Ya, tetapi ia menjalankan perintah kedua tanpa memperhatikan apakah perintah pertama berhasil. a;bartinya "lari alalu lari b." a&&bartinya "lari a, lalu jalankan bhanya jika aberhasil".
cdhowie
33

perintah1 && perintah2

command1 && command2dijalankan command2jika (dan hanya jika) command1eksekusi berakhir dengan sukses. Dalam jargon Unix, itu berarti kode keluar / kode pengembalian sama dengan nol.

perintah1; perintah2

command1; command2dieksekusi command2setelah dieksekusi command1, secara berurutan. Tidak peduli apakah perintah itu berhasil atau tidak.

jimm-cl
sumber
6

Yang pertama adalah logika sederhana yang ANDmenggunakan evaluasi hubung singkat, yang terakhir hanya membatasi dua perintah.

Apa yang terjadi secara nyata adalah ketika program pertama mengembalikan kode keluar bukan nol, keseluruhan ANDdievaluasi FALSEdan perintah kedua tidak akan dijalankan. Kemudian hanya mengeksekusi keduanya secara berurutan.

Danstahr
sumber