Bagaimana cara rantai perintah pada konsol?

23

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?

metafora pythonic
sumber
Ini jawaban yang bagus dari Unix SE.
NonlinearFruit

Jawaban:

39

Gunakan &&operator,

cmd1 && cmd2 && cmd3

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"adalah falseuntuk setiap x, sehingga tidak ada kebutuhan untuk mengevaluasi x(terutama jika xadalah 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 berarti false(kegagalan). Jadi, ketika perintah pertama dalam cmd1 && cmd2pengembalian "false"(status keluar nol, yang menunjukkan kegagalan), status perintah majemuk dikenal: kegagalan. Jadi interpretasi keseluruhan cmd1 && cmd2 mungkin: "jalankan cmd1, DAN LALU, jika tidak gagal, cmd2". Yang pada dasarnya Anda inginkan dalam pertanyaan Anda.

Demikian pula dengan OR: cmd1 || cmd2dapat diartikan sebagai "mengeksekusi cmd1, ATAU JIKA gagal, cmd2".


Protip: untuk rantai yang lebih panjang &&, pertimbangkan untuk memasukkan set -eskrip Anda. Ini pada dasarnya mengubah titik koma ;menjadi &&, dengan beberapa kasus khusus.

ulidtko
sumber
1
+1 untuk menjelaskan||
Alp
dapatkah kamu rantai apa pun status perintah pertama? (sukses atau gagal)
Hugo Trentesaux
@HugoTrentesaux apa maksudmu? .. Keberhasilan / hasil kegagalan atau A || Bhanya sama dengan [hubungan arus pendek] logis A OR B . A || Badalah keberhasilan ketika Aitu sukses , atau ketika Aitu gagal tapi Bitu sukses ; dan A || Bmerupakan kegagalan ketika Aitu gagal dan Bitu failure. Demikian pula untuk &&, ini mengikuti logika AND.
ulidtko
Dalam konteks shell, bagaimana saya bisa menjalankan A dan kemudian B tidak masalah jika A gagal atau berhasil?
Hugo Trentesaux
1
@HugoTrentesaux itulah yang biasa dilakukan polos ;(atau baris baru) secara default. set -eakan berubah ;menjadi &&, secara kasar. set +e[default] berubah A; Bmenjadi apa yang Anda katakan: jalankan A, lalu apa pun yang dijalankan B.
ulidtko
13

"Chaining Memerintahkan pengelompokan mereka"

ping 192.168.0.1 || { echo "ping not successful"; exit 1; }

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!

dan saya
sumber
6

Cukup dengan &&operator. Contohnya:

cmd1 && cmd2 && cmd3

Jika salah satu perintah gagal (mengembalikan nilai keluar selain 0), perintah lain tidak akan berjalan.

Wuffers
sumber