Script ini tidak menggema "setelah":
#!/bin/bash -e
echo "before"
echo "anything" | grep e # it would if I searched for 'y' instead
echo "after"
exit
Itu juga akan terjadi jika saya menghapus -e
opsi pada baris shebang, tetapi saya ingin menyimpannya sehingga skrip saya berhenti jika ada kesalahan. Saya tidak menganggap grep menemukan kecocokan sebagai kesalahan. Bagaimana saya dapat mencegahnya keluar begitu tiba-tiba?
bash
grep
exit
error-handling
iago-lito
sumber
sumber
-e
Anda mengira Anda benar-benar peduli: sedemikian rupa sehingga masalah apa pun adalah bencana besar.var=$(complex command | grep complex_pattern)
yang mungkin nol (dalam hal ini program saya seharusnya tidak berakhir). Ini hanyalah skrip rebus yang membuat masalah terjadi. Tidak ada lubang hitam metafisik dalam logika di sini, kan? ;)Jawaban:
Penjelasan:
"||" berarti "atau". Jika bagian pertama dari perintah "gagal" (artinya "grep e" mengembalikan kode keluar non-nol) maka bagian setelah "||" dieksekusi, berhasil dan mengembalikan nol sebagai kode keluar (
true
selalu mengembalikan nol).sumber
/bin/true
adalah:command || :
(jadi dalam kasus Anda,set -e; grep 'needle' haystack || :
).true
adalah built-in di beberapa shell (setidaknya padabash 4.3
pada RHEL)Cara tangguh untuk mengirim pesan dengan aman dan opsional
grep
:Menurut manual posix , kode keluar 1 berarti tidak ada baris yang dipilih, dan> 1 berarti kesalahan.
sumber
Opsi lain adalah menambahkan perintah lain ke dalam pipeline - yang tidak gagal:
echo "anything" | grep e | cat
Karena
cat
sekarang perintah terakhir dalam pipa, itu status keluarcat
, bukangrep
, yang akan digunakan untuk menentukan apakah pipa gagal atau tidak.sumber
Pilihan lain:
sumber
Larutan
Penjelasan
set -e
atauset -o errexit
Plus,
:
adalah perintah tanpa efek di Bash.sumber