Saya telah meretas banyak skrip shell, dan terkadang hal yang paling sederhana membuat saya bingung. Hari ini saya menemukan skrip yang banyak menggunakan :
(titik dua) bash bawaan.
Dokumentasinya tampaknya cukup sederhana:
: (a colon) : [arguments]
Tidak melakukan apa pun selain memperluas argumen dan melakukan pengalihan. Status pengembalian adalah nol.
Namun saya sebelumnya hanya melihat ini digunakan dalam demonstrasi ekspansi shell. Kasus penggunaan dalam skrip yang saya temukan memanfaatkan struktur ini secara ekstensif:
if [ -f ${file} ]; then
grep some_string ${file} >> otherfile || :
grep other_string ${file} >> otherfile || :
fi
Sebenarnya ada ratusan grep, tetapi jumlahnya lebih banyak. Tidak ada pengalihan input/output selain struktur sederhana di atas. Tidak ada nilai kembalian yang diperiksa nanti dalam skrip.
Saya membaca ini sebagai konstruksi tidak berguna yang mengatakan "atau tidak melakukan apa-apa". Tujuan apa yang dapat digunakan untuk mengakhiri grep ini dengan "atau tidak melakukan apa-apa"? Dalam kasus apa konstruk ini akan menyebabkan hasil yang berbeda dari sekadar mengabaikan || :
dari semua contoh?
Jawaban yang Diterima:
Tampaknya :
s dalam skrip Anda digunakan sebagai pengganti true
. Jika grep
tidak menemukan kecocokan dalam file, itu akan mengembalikan kode keluar bukan nol; seperti yang disebutkan jw013 dalam komentar, jika errexit
disetel, mungkin dengan -e
pada baris Shebang, skrip akan keluar jika salah satu dari grep
s gagal menemukan kecocokan. Jelas, bukan itu yang diinginkan penulis, jadi dia menambahkan || :
untuk membuat status keluar dari perintah gabungan tertentu selalu nol, seperti yang lebih umum (dalam pengalaman saya) || true
/|| /bin/true
.