Wenn ich versuche, mail
eine Funktion in einem Bash-Skript auszuführen , entsteht etwas Ähnliches wie eine Gabelbombe. Zur Verdeutlichung entsteht dadurch das Problem:
#!/bin/bash
mail() {
echo "Free of oxens" | mail -s "Do you want to play chicken with the void?" "[email protected]"
}
mail
exit 0
Manchmal können Sie den Befehl einfach beenden und die untergeordneten Prozesse werden beendet, aber manchmal müssen Sie dies tun killall -9
.
Es ist egal, ob die Mail gesendet wurde oder nicht. Die Gabelbombe wird so oder so erzeugt. Und es scheint nicht hilfreich zu sein, den Exit-Code zu überprüfen if ! [ "$?" = 0 ]
.
Das folgende Skript funktioniert jedoch wie beabsichtigt. Entweder gibt es einen Fehler aus oder es sendet die E-Mail.
#!/bin/bash
echo "Free of oxens" | mail -s "Do you want to play chicken with the void?" "[email protected]"
exit 0
Warum passiert das? Und wie würden Sie den Exit-Code des Mail-Befehls überprüfen?
bash
shell-script
mail-command
roxto
quelle
quelle
Antworten:
Sie rufen die Funktion
mail
innerhalb derselben Funktion auf:Das sollte funktionieren:
Beachten Sie, dass der Funktionsname nicht mehr innerhalb der Funktion selbst aufgerufen wird.
quelle
Andernfalls:
... sollte gut funktionieren.
quelle
command
Teil betont , und für den Laien ist es schwer zu bemerken, dass sich diese Änderung zusammen mit derolly olly oxenfree
und'and the rest' and@more
ändert, insbesondere mit der Syntaxhervorhebung.Die "traditionellste" Lösung in diesen Fällen besteht darin, den Befehl mit vollständigem Pfad aufzurufen:
Alle anderen Antworten funktionieren und sind wahrscheinlich portabler, aber ich denke, dass dies die wahrscheinlichste Lösung ist, die Sie in Skripten in der wilden realen Welt finden würden. Der Vollständigkeit halber füge ich sie daher hinzu.
quelle
/bin/mail
. Ich denke, das beweist den Wert dercommand mail
Syntax./usr
weil ihr Paradigma darin besteht, alle Binärdateien in dasselbe Verzeichnis zu verschieben, also/bin
nur ein Symlink zu/usr/bin
. Also ja ... das ist nicht portabel, aber es wird häufiger gesehen alscommand
irgendwie - insbesondere in älteren Boot-Skripten, die speziell für jede Distribution erstellt wurden, wurden alle absoluten Pfade fest codiert (z. B. RC-Skripte in Slackware).