Apa alasan menggunakan && alih-alih; untuk menempatkan perintah pada baris yang sama?

30

Tidak menjadi ahli di kedua Linux bukan Unix Saya bertanya-tanya apa perbedaan antara metode 2 ini merangkai 2 perintah pada baris yang sama? Saya tidak melihat perbedaan dalam output dalam contoh sederhana ini

Pete$date ; time
Sun Mar 17 19:37:20 EDT 2013

real    0m0.000s
user    0m0.000s
sys 0m0.000s

Pete$date &&time
Sun Mar 17 19:37:46 EDT 2013

real    0m0.000s
user    0m0.000s
sys 0m0.000s

Ini tidak menyebabkan masalah - Saya hanya ingin tahu ..

pfeiffep
sumber

Jawaban:

43

&&adalah logis 'dan'. Argumen pertama dievaluasi, dan yang kedua dievaluasi hanya jika yang pertama menghasilkan true. Alasannya adalah "false AND something" selalu false, jadi tidak perlu mengevaluasi argumen kedua dalam kasus ini.

Jadi menggunakan &&Anda memastikan bahwa perintah kedua tidak dieksekusi jika yang pertama melaporkan kesalahan ( truediwakili oleh kode keluar 0, yang menunjukkan bahwa tidak ada kesalahan). Sebaliknya, ;jalankan kedua perintah, tidak peduli apa hasil dari yang pertama.

Kesimpulan: Perintah chaining dengan &&adalah kebiasaan yang baik. Berbeda dengan ;itu tidak akan menjalankan perintah berikutnya jika ada kesalahan.

azimut
sumber
maksud Anda 0artinya trueatau itu 0berarti benar - ada kesalahan?
Michael Butler
1
@MichaelButler: 0berarti true. Saya telah menambahkan klarifikasi.
azimut
26

;

Menjalankan perintah secara berurutan, apa pun status keluar sebelumnya:

# sh -c "exit 0" ; echo "2nd command"
2nd command
# sh -c "exit 1" ; echo "2nd command"
2nd command

&&

Logis dan

Jalankan perintah berikutnya, tetapi hanya jika perintah sebelumnya berhasil (status keluar adalah 0):

# sh -c "exit 0" && echo "2nd command"
2nd command
# sh -c "exit 1" && echo "2nd command"
#

||

Logis atau

Jalankan perintah berikutnya, tetapi hanya jika perintah sebelumnya gagal (status keluar tidak 0 ):

# sh -c "exit 0" || echo "2nd command"
#
# sh -c "exit 1" || echo "2nd command"
2nd command
phoibos
sumber
6
Juga, sh -c "exit 0"bisa diganti dengan truedalam contoh ini, dan sh -c "exit 1"dengan false.
Flimm