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?

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.


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.


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.


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"
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.