Dalam bash
, saya terkadang ingin menjalankan beberapa perintah secara serial dan tidak ingin menunggu sampai selesai sebelum saya mengetik yang baru. Jadi saya melakukan sesuatu seperti ini:
cmd1; cmd2; cmd3
Sayangnya, salah satu perintah mungkin gagal. Dalam hal ini, saya ingin berhenti. Apakah ada cara mudah untuk melakukan ini, tetapi membuatnya agar saya hanya terus menjalankan perintah jika perintah sebelumnya memiliki kode keluar 0?
command-line
bash
metafora pythonic
sumber
sumber
Jawaban:
Gunakan
&&
operator,Dalam shellscripting,
&&
dan||
operator dimodelkan setelah implementasi optimal dari operator logis dalam C.&&
berarti DAN operator, dan||
berarti OR. Unix terkait erat dengan C, dan di C, operan kedua dari operator logis tidak dievaluasi jika hasilnya sudah diketahui dari operan pertama. Misalnya"false && x"
adalahfalse
untuk setiapx
, sehingga tidak ada kebutuhan untuk mengevaluasix
(terutama jikax
adalah fungsi panggilan); sama untuk"true || x"
. Ini juga disebut semantik hubungan pendek .Dan di Unix, adalah tradisional untuk menafsirkan nilai-nilai pengembalian perintah sebagai nilai-nilai kebenaran "berhasil diselesaikan": kode keluar 0 berarti
true
(berhasil), bukan nol berartifalse
(kegagalan). Jadi, ketika perintah pertama dalamcmd1 && cmd2
pengembalian"false"
(status keluar nol, yang menunjukkan kegagalan), status perintah majemuk dikenal: kegagalan. Jadi interpretasi keseluruhancmd1 && cmd2
mungkin: "jalankancmd1
, DAN LALU, jika tidak gagal,cmd2
". Yang pada dasarnya Anda inginkan dalam pertanyaan Anda.Demikian pula dengan OR:
cmd1 || cmd2
dapat diartikan sebagai "mengeksekusicmd1
, ATAU JIKA gagal,cmd2
".Protip: untuk rantai yang lebih panjang
&&
, pertimbangkan untuk memasukkanset -e
skrip Anda. Ini pada dasarnya mengubah titik koma;
menjadi&&
, dengan beberapa kasus khusus.sumber
||
A || B
hanya sama dengan [hubungan arus pendek] logis A OR B .A || B
adalah keberhasilan ketikaA
itu sukses , atau ketikaA
itu gagal tapiB
itu sukses ; danA || B
merupakan kegagalan ketikaA
itu gagal danB
itufailure
. Demikian pula untuk&&
, ini mengikuti logika AND.;
(atau baris baru) secara default.set -e
akan berubah;
menjadi&&
, secara kasar.set +e
[default] berubahA; B
menjadi apa yang Anda katakan: jalankanA
, lalu apa pun yang dijalankanB
."Chaining Memerintahkan pengelompokan mereka"
ping, hanya jika tidak berhasil, mengeksekusi grup perintah yang dirantai dalam tanda kurung.
Perhatian:
Daftar harus diakhiri dengan ";".
Harus ada ruang kosong antara tanda kurung dan perintah yang dikelompokkan!
sumber
Cukup dengan
&&
operator. Contohnya:Jika salah satu perintah gagal (mengembalikan nilai keluar selain 0), perintah lain tidak akan berjalan.
sumber