Apakah ada perbedaan antara bagaimana dua ampersand dan semi-colon beroperasi di bash?

71

Jika saya ingin menjalankan dua perintah terpisah pada satu baris, saya bisa melakukan ini:

cd /home; ls -al

atau ini:

cd /home && ls -al

Dan saya mendapatkan hasil yang sama. Namun, apa yang terjadi di latar belakang dengan kedua metode ini? Apa perbedaan fungsional di antara mereka?

Sean P
sumber

Jawaban:

88

Orang ;benar memisahkan satu perintah dari yang lain. The &&mengatakan hanya menjalankan perintah berikut jika sebelumnya berhasil

cd /home; ls -al

Ini akan cd /homedan bahkan jika cdperintah gagal ( /hometidak ada, Anda tidak memiliki izin untuk melewatinya, dll.), Itu akan berjalan ls -al.

cd /home && ls -al

Ini hanya akan menjalankan ls -aljika cd /homeberhasil.

user9517 mendukung GoFundMonica
sumber
2
penggunaan ; adalah benar-benar berbahaya (setidaknya dengan perintah rm), misalnya cd /some/dir; rm -fr ./*. Jadi dengan operasi yang merusak Anda harus yakin bahwa Anda berada di tempat yang tepat sebelum menjalankan rm. Perintah yang benar adalahcd /some/dir && rm -fr ./*
ALex_hha
70
a && b

jika a mengembalikan nol kode keluar, maka b dieksekusi.

a || b

jika suatu mengembalikan kode non-zero exit, maka b dijalankan.

a ; b

a dieksekusi dan kemudian b dieksekusi.

Lagu Minsuk
sumber
16
cd /fakedir; ls -al

Berjalan lsdi direktori saat ini karena cd /fakedirakan gagal dan shell akan mengabaikan status keluar yang bukan nol.

cd /fakedir && ls -al

Karena &&operator hanya akan melanjutkan jika perintah sebelumnya keluar secara normal (status nol), tidak ada lsoperasi yang akan dilakukan.

Ada operator lain, seperti &yang akan melatarbelakangi suatu proses. Meskipun sering ditempatkan di akhir perintah, itu bisa diletakkan di tengah rantai.

Jeff Ferland
sumber
4

Anda juga dapat bergabung bersama mereka seperti if..then..elselogika perintah chaining.

contoh:

ls file.ext && echo "file exists" || echo "file does not exist"
Mtl Dev
sumber