Aus Sicherheitsgründen möchte ich, dass Bash die Ausführung eines Skripts abbricht, wenn es auf einen Syntaxfehler stößt.
Zu meiner Überraschung kann ich das nicht erreichen. ( set -e
ist nicht genug.) Beispiel:
#!/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!'
Ergebnis (bash-3.2.39 oder 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!
$
Nun, wir können nicht $?
nach jeder Anweisung prüfen, ob Syntaxfehler vorliegen.
(Ich habe ein solches sicheres Verhalten von einer vernünftigen Programmiersprache erwartet ... vielleicht muss dies als Fehler gemeldet werden / möchte Entwickler verprügeln)
Weitere Experimente
if
macht keinen Unterschied.
Entfernen 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!'
Ergebnis:
$ ./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!
$
Vielleicht hat es etwas mit Übung 2 von http://mywiki.wooledge.org/BashFAQ/105 zu tun (( ))
. Aber ich finde es immer noch unvernünftig, die Ausführung nach einem Syntaxfehler fortzusetzen.
Nein, (( ))
macht keinen Unterschied!
Es verhält sich auch ohne den Rechentest schlecht! Nur ein einfaches, einfaches Skript:
#!/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!'
Ergebnis:
$ ./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
es nicht funktioniert hat. Aber meine Frage macht immer noch Sinn. Ist es möglich, bei einem Syntaxfehler abzubrechen?
set -e
ist nicht genug, weil Ihr Syntaxfehler in einerif
Anweisung ist. An jeder anderen Stelle sollte das Skript abgebrochen werden.