Saat ini saya sedang mengeksplorasi paket Debian, dan saya telah membaca beberapa contoh kode. Dan pada setiap baris, misalnya, postinst
skrip adalah pola.
some command || true
another command || true
Jadi jika beberapa perintah gagal, maka baris mengembalikan true tetapi saya tidak melihat bagaimana ini mempengaruhi output dari program.
shell-script
error-handling
tukang kayu
sumber
sumber
||:
adalah cara idiomatis lain untuk menulis ini (:
menjadi entri lain dalam tabel builtin menunjuk ketrue
- tetapi dijamin akan menjadi builtin bahkan kembali ke Bourne; yang mengatakan, untuk POSIX sh,true
juga dijamin menjadi builtin - jadi itu adalah lebih terseness daripada efisiensi bahkan di zaman modern sekalipun).Jawaban:
Alasan untuk pola ini adalah bahwa skrip pengelola dalam paket Debian cenderung untuk memulai
set -e
, yang menyebabkan shell keluar segera setelah perintah apa pun (secara tegas, pipa, daftar atau perintah majemuk) keluar dengan status bukan nol. Ini memastikan bahwa kesalahan tidak menumpuk: begitu ada masalah, skrip dibatalkan.Dalam kasus di mana perintah dalam skrip dibiarkan gagal, menambahkan
|| true
memastikan bahwa perintah majemuk yang dihasilkan selalu keluar dengan status nol, sehingga skrip tidak dibatalkan. Misalnya, menghapus direktori seharusnya bukan kesalahan fatal (mencegah paket dihapus); jadi kami akan gunakankarena
rmdir
tidak memiliki opsi untuk mengatakannya untuk mengabaikan kesalahan.sumber
set -e
tidak perlu|| true
sama sekali, saya pikir penting untuk memberikan konteksnya. Jika Anda melihat hal-hal aneh pada POWER, saya sangat menyarankan Anda untuk mengajukan bug (reportbug
)!set -e
bukan hanya "Konvensi Debian", tetapi pola pemrograman yang baik harus selalu digunakan. Lihat. misalnya davidpashley.com/articles/writing-robust-shell-scripts|| true
set -e adalah konteks yang mungkin dan kemungkinan yang paling umum. Saya tunduk pada jawaban ini! Secara harfiah, ini berguna kapan saja status keluar dianggap tidak relevan DAN (seperti yang Anda tambahkan tautan artikel) Saya tidak menggunakan status keluar sebagai bagian dari kontrol skrip saya. Saya melihat utilitas (dalamset -e
) tetapi tidak akan pergi sejauh artikel dan mengatakan "Setiap skrip yang Anda tulis harus menyertakan set -e di bagian atas". Ini adalah gaya pemrograman. "SELALU | Setiap" memasukkannya sendiri set perangkap - alias - absolut re: solusi wild-card padaALWAYS
akhirnya akan menjadi bumerang alias - tidak ada wahana gratis.set -e
perilaku. Mungkin tidak masalah bagi Anda, jika hanya target Andabash
dan kerang-kerang yang relatif baru yang hidup/bin/sh
, tetapi situasinya lebih bernuansa ketika Anda ingin mendukung kerang / sistem lama.set -e
sangat teliti yang mendokumentasikan perilaku kerang yang berbeda oleh Sven Mascheck , meskipun halaman ini juga mendokumentasikan banyak kerang bersejarah / kuno yang tidak relevan saat ini. Ada juga dua halaman ini dengan fokus modern yang lebih sempit (mencari "set -e"): halaman "lintsh" , dokumentasi shell portabel autoconf -> Batasan subhalamanMeskipun tidak mempengaruhi output dari program yang baru saja dijalankan - ini memungkinkan pemanggil untuk melanjutkan seolah-olah semua baik-baik saja alias mempengaruhi logika masa depan.
Diulang: itu menutupi status kesalahan dari perintah sebelumnya.
sumber
set -e
dan|| true
utilitas akan ditentukan oleh sifat dan tujuan dari programmergit remote remove foo || true
git remote add foo http://blah
- kami ingin mengabaikan kesalahan jika remote tidak ada.