Agar aman, saya ingin bash membatalkan eksekusi skrip jika menemui kesalahan sintaksis.
Yang mengejutkan saya, saya tidak bisa mencapai ini. ( set -e
tidak cukup.) Contoh:
#!/bin/bash
# Do exit on any error:
set -e
readonly a=(1 2)
# A syntax error is here:
if (( "${a[#]}" == 2 )); then
echo ok
else
echo not ok
fi
echo status $?
echo 'Bad: has not aborted execution on syntax error!'
Hasil (bash-3.2.39 atau bash-3.2.51):
$ ./sh-on-syntax-err
./sh-on-syntax-err: line 10: #: syntax error: operand expected (error token is "#")
status 1
Bad: has not aborted execution on syntax error!
$
Ya, kami tidak dapat memeriksa $?
setelah setiap pernyataan untuk mengetahui kesalahan sintaksis.
(Saya mengharapkan perilaku aman dari bahasa pemrograman yang masuk akal ... mungkin ini harus dilaporkan sebagai bug / keinginan untuk mem-bash pengembang)
Eksperimen lebih banyak
if
tidak ada bedanya.
Menghapus if
:
#!/bin/bash
set -e # exit on any error
readonly a=(1 2)
# A syntax error is here:
(( "${a[#]}" == 2 ))
echo status $?
echo 'Bad: has not aborted execution on syntax error!'
Hasil:
$ ./sh-on-syntax-err
./sh-on-syntax-err: line 6: #: syntax error: operand expected (error token is "#")
status 1
Bad: has not aborted execution on syntax error!
$
Mungkin, ini terkait dengan latihan 2 dari http://mywiki.wooledge.org/BashFAQ/105 dan ada hubungannya dengan (( ))
. Tapi saya merasa masih tidak masuk akal untuk terus mengeksekusi kesalahan sintaks.
Tidak, (( ))
tidak ada bedanya!
Itu berperilaku buruk bahkan tanpa tes aritmatika! Hanya skrip dasar yang sederhana:
#!/bin/bash
set -e # exit on any error
readonly a=(1 2)
# A syntax error is here:
echo "${a[#]}"
echo status $?
echo 'Bad: has not aborted execution on syntax error!'
Hasil:
$ ./sh-on-syntax-err
./sh-on-syntax-err: line 6: #: syntax error: operand expected (error token is "#")
status 1
Bad: has not aborted execution on syntax error!
$
set -e
tidak berhasil. Tapi pertanyaan saya masih masuk akal. Apakah mungkin untuk membatalkan kesalahan sintaks?
set -e
tidak cukup karena kesalahan sintaks Anda dalamif
pernyataan. Di tempat lain harus batalkan naskah.