Saya belajar cara efisien menggunakan berbagai set
opsi dalam skrip saya dan menemukan set -u
yang tampaknya sempurna untuk keluar dari skrip saya jika variabel tidak diset dengan benar (mis. Menghapus pengguna). Menurut halaman manual , set -u
dan set -e
melakukan hal berikut ...
-e Exit immediately if a command exits with a non-zero status.
-u Treat unset variables as an error when substituting.
Saya membuat skrip pengujian untuk menguji fungsi ini, tetapi tampaknya tidak berfungsi seperti yang diharapkan. Mungkin seseorang bisa lebih menjelaskan masalah saya kepada saya dan di mana saya salah menafsirkan? Script tes di bawah ini. Terima kasih.
set -e
set -u
testing="This works"
echo $?
echo ${testing}
testing2=
echo $?
echo ${testing2}
testing3="This should not appear"
echo $?
echo ${testing3}
Saya mengharapkan skrip untuk menampilkan 0 dan "Ini berfungsi" , dan kemudian gagal karena ${testing2}
tidak diatur.
Sebagai gantinya saya ditampilkan 0 dan "Ini berfungsi" , diikuti oleh 0 dan kemudian 0 Ini seharusnya tidak muncul
Adakah yang bisa memberikan pengetahuan? Terima kasih.
sumber
Jawaban:
Dari "man Bash":
Ketika Anda melakukannya,
testing2=
Anda sedang mengatur variabel ke string nol.Ubah itu menjadi
unset testing2
dan coba lagi.Dalam hal
set -e
ini tidak membantu karena tugas tidak pernah memiliki kode keluar dari 1. Coba ini untuk melihat bahwa perintah terakhir yang dijalankan (tugas) memiliki kode keluar 0, atau baca pertanyaan ini :Dan saya juga percaya bahwa penggunaan set -e lebih merupakan masalah daripada solusi.
Apa yang mungkin mendapatkan kesalahan dengan penggunaan variabel yang tidak disetel adalah
set -u
:Akan menghasilkan:
sumber
testing2=
settesting2
variabel ke string kosong; variabel sebenarnya diatur .Namun jika Anda menjalankan
echo $testing99
Bash shell interaktif (tanpa pengaturanerrexit
, yaitu,set -e
), Anda akan mendapatkan kesalahan:Ke samping
Saat menguji skrip sekarang, saya menemukan bahwa shell interaktif tidak selalu keluar ketika mencoba untuk memperluas variabel yang belum ditetapkan sementara shell non-interaktif (menjalankan skrip shell) selalu keluar . Menurut halaman manual POSIX untuk
set
:Sebuah Bash shell interaktif tidak akan keluar kecuali
errexit
memiliki juga telah ditetapkan. Di sisi lain, shell dasbor interaktif tidak akan keluar - bahkan jikaset -e
sebelumnya telah dijalankan.sumber