Dalam shell POSIX, .
adalah builtin khusus, sehingga kegagalannya menyebabkan shell untuk keluar (dalam beberapa shell seperti bash
, itu hanya dilakukan ketika dalam mode POSIX).
Apa yang memenuhi syarat sebagai kesalahan tergantung pada shell. Tidak semua dari mereka keluar karena kesalahan sintaks saat mem-parsing file, tetapi sebagian besar akan keluar ketika file yang bersumber tidak dapat ditemukan atau dibuka. Saya tidak tahu ada yang akan keluar jika perintah terakhir dalam file yang bersumber dikembalikan dengan status keluar yang tidak nol (kecuali jika errexit
opsi ini aktif tentu saja).
Di sini melakukan:
[ -s "$NVM_DIR/nvm.sh" ] && \. "$NVM_DIR/nvm.sh"
Merupakan kasus di mana Anda ingin sumber file jika ada, dan jangan jika tidak (atau kosong di sini dengan -s
).
Artinya, itu tidak boleh dianggap sebagai kesalahan (kesalahan fatal dalam kulit POSIX) jika file tidak ada, file itu dianggap sebagai file opsional.
Itu masih akan menjadi kesalahan (fatal) jika file tidak dapat dibaca atau direktori atau (dalam beberapa shell) jika ada kesalahan sintaksis saat menguraikannya yang akan menjadi kondisi kesalahan nyata yang harus dilaporkan.
Beberapa akan berpendapat bahwa ada kondisi balapan. Tapi satu-satunya artinya adalah bahwa shell akan keluar dengan kesalahan jika file dihapus di antara [
dan .
, tapi saya berpendapat itu valid untuk menganggapnya kesalahan bahwa file jalur tetap ini tiba-tiba akan hilang saat skrip berlari.
Di samping itu,
command . "$NVM_DIR/nvm.sh" 2> /dev/null
di mana command
¹ menghapus atribut khusus ke .
perintah (sehingga tidak keluar dari shell on error) tidak akan berfungsi sebagai:
- itu akan menyembunyikan
.
kesalahan tetapi juga kesalahan dari perintah yang dijalankan di file bersumber
- itu juga akan menyembunyikan kondisi kesalahan nyata seperti file yang memiliki izin salah.
Sintaksis umum lainnya (lihat misalnya grep -r /etc/default /etc/init*
pada sistem Debian untuk skrip init yang belum dikonversi ke systemd
(di mana EnvironmentFile=-/etc/default/service
digunakan untuk menentukan file lingkungan opsional sebagai gantinya)) meliputi:
[ -e "$file" ] && . "$file"
Periksa file itu di sana, masih sumber jika kosong. Kesalahan masih fatal jika tidak bisa dibuka (meskipun ada di sana, atau ada di sana). Anda dapat melihat lebih banyak varian seperti [ -f "$file" ]
(ada dan merupakan file biasa ), [ -r "$file" ]
(dapat dibaca), atau kombinasi keduanya.
[ ! -e "$file" ] || . "$file"
Versi yang sedikit lebih baik. Membuatnya lebih jelas bahwa file tidak ada adalah kasus yang OK. Itu juga berarti $?
akan mencerminkan status keluar dari perintah terakhir yang dijalankan $file
(dalam kasus sebelumnya, jika Anda mendapatkannya 1
, Anda tidak tahu apakah itu karena $file
tidak ada atau jika perintah itu gagal).
command . "$file"
Harapkan file ada di sana, tetapi jangan keluar jika tidak bisa diartikan.
[ ! -e "$file" ] || command . "$file"
Kombinasi di atas: tidak masalah jika file tidak ada di sana, dan untuk cangkang POSIX, kegagalan untuk membuka (atau mengurai) file tersebut dilaporkan tetapi tidak fatal (yang mungkin lebih diinginkan ~/.profile
).
¹ Catatan: zsh
Namun, Anda tidak dapat menggunakan command
seperti itu kecuali dalam sh
persaingan; perhatikan bahwa di shell Korn, source
sebenarnya adalah alias untuk command .
, varian non-khusus.