In Perl können Sie mit einer Fehlermeldung mit beenden die "some msg"
. Gibt es einen äquivalenten Einzelbefehl in bash? Im Moment erreiche ich dies mit Befehlen:echo "some msg" && exit 1
Antworten:
Sie können Ihre eigenen leicht genug rollen:
die() { echo "$*" 1>&2 ; exit 1; }
...
die "Kaboom"
printf %s "${@+$@$'\n'}"
- Mit anderen Worten, drucken Sie die Argumente gefolgt von einer neuen Zeile, falls vorhanden.
"$*"
wahrscheinlich sinnvoller ist als "$@"
. Das Verhalten ist in den meisten Fällen identisch, unterscheidet sich jedoch für die -n Oops
(nicht, dass Sie dies tun möchten).
Dies ist eine sehr nahe an Perls "Würfel" liegende Funktion (jedoch mit Funktionsname):
function die
{
local message=$1
[ -z "$message" ] && message="Died"
echo "$message at ${BASH_SOURCE[1]}:${FUNCNAME[1]} line ${BASH_LINENO[0]}." >&2
exit 1
}
Und Bash Art zu sterben, wenn die eingebaute Funktion fehlgeschlagen ist (mit Funktionsname)
function die
{
local message=$1
[ -z "$message" ] && message="Died"
echo "${BASH_SOURCE[1]}: line ${BASH_LINENO[0]}: ${FUNCNAME[1]}: $message." >&2
exit 1
}
Daher speichert Bash alle erforderlichen Informationen in mehreren Umgebungsvariablen:
${1-Died}
- damit können Sie sogar eine leere Zeichenfolge übergeben, und es funktioniert wie erwartet.
Ja, so machst du das ziemlich genau.
Sie können anstelle von && ein Semikolon oder eine neue Zeile verwenden, da Sie beenden möchten, ob das Echo erfolgreich ist oder nicht (obwohl ich nicht sicher bin, was dazu führen würde, dass es fehlschlägt).
Das Programmieren in einer Shell bedeutet, viele kleine Befehle (einige eingebaute Befehle, einige winzige Programme) zu verwenden, die eine Sache gut machen, und sie mit Dateiumleitung, Exit-Code-Logik und anderem Kleber zu verbinden.
Es mag seltsam erscheinen, wenn Sie an Sprachen gewöhnt sind, in denen alles mit Funktionen oder Methoden erledigt wird, aber Sie gewöhnen sich daran.
CMD1 || (echo 'ERROR MSG'; exit 1); CMD2; CMD3
. Wenn CMD1 fehlschlägt, erwarte ich, dass das Echo und das Beenden stattfinden und das Skript beendet wird. Wenn CMD1 jetzt ausfällt, werden CMD2 und CMD3 tatsächlich vor dem Echo ausgeführt. Dies entspricht dem Fehlerprotokoll. Bizarr oder nicht?
{}
statt ()
, um das Problem mit der Unterschale zu vermeiden. Es ist auch eine gute Idee, Fehler an stderr anstatt an stdout zu senden:CMD1 || { echo 'ERROR MSG' >&2; exit 1; }; CMD2; CMD3
# echo pass params and print them to a log file
wlog(){
# check terminal if exists echo
test -t 1 && echo "`date +%Y.%m.%d-%H:%M:%S` [$$] $*"
# check LogFile and
test -z $LogFile || {
echo "`date +%Y.%m.%d-%H:%M:%S` [$$] $*" >> $LogFile
} #eof test
}
# eof function wlog
# exit with passed status and message
Exit(){
ExitStatus=0
case $1 in
[0-9]) ExitStatus="$1"; shift 1;;
esac
Msg="$*"
test "$ExitStatus" = "0" || Msg=" ERROR: $Msg : $@"
wlog " $Msg"
exit $ExitStatus
}
#eof function Exit