Saya menggunakan opsi berikut
set -o pipefail
set -e
Dalam skrip bash untuk menghentikan eksekusi karena kesalahan. Saya memiliki ~ 100 baris eksekusi skrip dan saya tidak ingin memeriksa kembali kode setiap baris dalam skrip.
Tetapi untuk satu perintah tertentu, saya ingin mengabaikan kesalahan. Bagaimana saya bisa melakukan itu?
-e
atribut disetel "jika perintah yang gagal adalah bagian dari daftar perintah segera mengikutiwhile
atauuntil
kata kunci, bagian dari tes dalamif
pernyataan, bagian dari setiap perintah yang dieksekusi dalam daftar&&
atau||
kecuali perintah yang mengikuti akhir&&
atau||
, perintah apa pun dalam pipa tetapi yang terakhir, atau jika status pengembalian perintah sedang terbalik dengan!
. "(ldd $2/bin/* || true) | grep "not found" | wc -l
script berakhir setelah baris ini ketika ldd kembali gagal(ldd $2/bin/* || true) | grep "not found" | wc -l || true
set -o pipefail
. ketikagrep
tidak menemukan apa pun, ia mengembalikan kode keluar non-nol dan cukup bagi shell untuk berpikir bahwa seluruh pipa memiliki kode keluar non-nol.Tambahkan saja
|| true
setelah perintah di mana Anda ingin mengabaikan kesalahan.sumber
set -e
dan mencoba menangkap pesan kesalahan: mis.set -e; TEST=$(foo 2>&1 || true); echo $TEST
Jangan berhenti dan simpan juga status keluar
Untuk jaga-jaga jika Anda ingin skrip Anda tidak berhenti jika perintah tertentu gagal dan Anda juga ingin menyimpan kode kesalahan perintah gagal:
sumber
command
berhasil dan perlu menjalankan apa yang terjadi setelah||
. membacanya sebagai: jikacommand
gagal, lakukanEXIT_CODE=$?
. Anda mungkin bisa melakukancommand || echo "$?"
atau menggunakan "trap" untuk debugging verbose yang lebih banyak. Lihat ini -> stackoverflow.com/a/6110446/10737630Lebih ringkas:
Dari spesifikasi POSIX mengenai
set -e
(penekanan tambang):sumber
-e
.!
akan mencegah shell keluar tidak peduli apa pun. Skrip ini menampilkan pesanStill alive!
ketika saya menjalankannya, menunjukkan bahwa skrip berjalan hingga selesai. Apakah Anda melihat perilaku yang berbeda?if
klausa dan memecahkan masalah.Alih-alih "mengembalikan true", Anda juga dapat menggunakan utilitas "noop" atau null (sebagaimana dimaksud dalam spesifikasi POSIX )
:
dan hanya "tidak melakukan apa-apa". Anda akan menyimpan beberapa surat. :)sumber
Jika Anda ingin mencegah skrip Anda gagal dan mengumpulkan kode kembali:
returncode
dikumpulkan tidak peduli apakah perintah berhasil atau gagal.sumber
Saya telah menggunakan potongan di bawah ini ketika bekerja dengan alat CLI dan saya ingin tahu apakah ada sumber daya atau tidak, tapi saya tidak peduli dengan hasilnya.
sumber
if [ -r not_exist ]
Saya suka solusi ini:
Perintah / skrip di antara tick kembali dieksekusi dan outputnya dimasukkan ke perintah ":" (yang setara dengan "true")
sunting: Memperbaiki kesalahan ketik yang jelek
sumber
sementara
|| true
yang disukai, tetapi Anda juga bisa melakukannyasumber
Tidak ada solusi yang berfungsi untuk saya dari sini, jadi saya menemukan solusi lain:
Ini berguna untuk CI & CD. Dengan cara ini pesan kesalahan dicetak tetapi keseluruhan skrip terus dijalankan.
sumber
Contoh penggunaan ini untuk membuat file log
sumber
Terima kasih atas solusi sederhana di sini dari atas:
Konstruksi berikut dapat digunakan untuk tindakan tambahan / pemecahan masalah langkah skrip dan opsi kontrol aliran tambahan:
Kami dapat mengerem tindakan lebih lanjut dan
exit 1
jika diperlukan.sumber