Gibt es eine Möglichkeit zu überprüfen, ob bei der Ausführung eines Befehls ein Fehler vorliegt?
Beispiel
test1=`sed -i "/:@/c connection.url=jdbc:oracle:thin:@$ip:1521:$dataBase" $search`
valid $test1
function valid () {
if $test -eq 1; then
echo "OK"
else echo "ERROR"
fi
}
Ich habe es bereits versucht, aber es scheint nicht zu funktionieren. Ich weiß nicht, wie das geht.
command-line
moata_u
quelle
quelle
valid
) definieren, bevor Sie sie aufrufen.Antworten:
Der Rückgabewert wird in gespeichert
$?
. 0 zeigt Erfolg an, andere zeigen Fehler an.Wie bei jedem anderen Textwert können Sie ihn zum späteren Vergleich in einer Variablen speichern:
Mögliche Vergleichsoperatoren finden Sie unter
man test
.quelle
;
vor daselse
und setzenfi
: `if ...; dann ...; sonst ...; fitest
.[ $? ]
(oder gleichwertigtest $?
) funktioniert nicht, da$?
es eine Zahl (0, 1 usw.) ergibt, die nicht null ist. In den Dokumenten finden Sie folgende Informationentest
: "Wenn EXPRESSION weggelassen wird, gibt 'test' false zurück. Wenn EXPRESSION ein einzelnes Argument ist, gibt 'test' false zurück, wenn das Argument null ist, und andernfalls true."Wenn Sie nur wissen müssen, ob der Befehl erfolgreich war oder fehlgeschlagen ist, testen Sie ihn nicht, sondern testen Sie ihn
$?
direkt. Z.B:Und das Zuweisen der Ausgabe zu einer Variablen ändert den Rückgabewert nicht (nun, es sei denn, es verhält sich anders, wenn stdout natürlich kein Terminal ist).
http://mywiki.wooledge.org/BashGuide/TestsAndConditionals erklärt
if
genauer.quelle
$?
Sie sagen zu Unrecht, dass das direkte Testen des Befehls strikt besser ist.local
Befehl, dhlocal foo=$(false); echo $?;
erzeugt0
am Ausgang. Istlocal
aber nur innerhalb von Bash-Funktionen relevant.quelle
command
Fehler auf dem Bildschirm angezeigt wird, wie kann er ausgeblendet werden?command
Fehler in stderr ausschreiben, können Sie das Formular verwendencommand 2> /dev/null && echo OK || echo Failed
. Der2> /dev/null
leitet die stderr-Ausgabe weiter an/dev/null
. Einige Dienstprogramme schreiben jedoch Fehler in stdout (obwohl dies keine gute Vorgehensweise ist). In diesem Fall können Sie die 2 in der Umleitung weglassen, verlieren jedoch alle Ausgaben des Befehls. Diese Methode zur Erfolgskontrolle eignet sich für einfache ternäre Logik, für komplexere Verhalten ist es jedoch am besten, die$?
Erfolgskontrolle für Befehleif
durchzuführen oder die in der Antwort von @ geirha beschriebene Blockmethode zu verwenden.$? sollte den Exit-Status des vorherigen Befehls enthalten, der null sein sollte, damit kein Fehler auftritt.
So etwas wie;
In den meisten Fällen ist es einfacher, Befehle, die voneinander abhängig sein müssen, mit dem Konstrukt && zu verketten. So
cd /nonexistant && echo success!
würde nicht echo Erfolg , weil der Befehl bricht vor &&. Die Konsequenz daraus ist ||, wocd /nonexistant || echo fail
das Echo fehlschlagen würde , weil die CD fehlgeschlagen ist. (Dies ist nützlich, wenn Sie beispielsweise || exit verwenden, wodurch das Skript beendet wird, wenn der vorherige Befehl fehlgeschlagen ist.)quelle
quelle
command; echo $?
?true && echo $? || echo $?
/true; echo $?
undfalse && echo $? || echo $?
/false; echo $?
- Sie werden feststellen, dass sie genau dasselbe tun: Dcommand && echo "success: $?" || echo "fail: $?"
Es sollte beachtet werden, dass
if...then...fi
und&&
/ oder der||
Typ des Ansatzes den Exit-Status behandelt, der von dem Befehl zurückgegeben wird, den wir testen möchten (0 bei Erfolg); Einige Befehle geben jedoch keinen Exit-Status ungleich Null zurück, wenn der Befehl fehlgeschlagen ist oder Eingaben nicht verarbeiten konnte. Dies bedeutet, dass die üblichenif
und&&
/||
Ansätze für diese bestimmten Befehle nicht funktionieren.Unter Linux wird GNU beispielsweise
file
immer noch mit 0 beendet, wenn eine nicht vorhandene Datei als Argument empfangen wurde undfind
der angegebene Benutzer die Datei nicht finden konnte.In solchen Fällen besteht eine mögliche Möglichkeit, mit der Situation umzugehen, darin,
stderr
/stdin
messages zu lesen , z. B. diejenigen, die perfile
Befehl zurückgegeben werden, oder die Ausgabe des Befehls wie in zu analysierenfind
. Zu diesem Zweckcase
könnte die Anweisung verwendet werden.(Dies ist eine Wiederholung meiner eigenen Antwort auf verwandte Fragen unter unix.stackexchange.com )
quelle
Wie in vielen anderen Antworten erwähnt, reicht ein einfacher Test des
$?
Willens ausWenn Sie testen möchten, ob der Befehl fehlgeschlagen ist , können Sie eine kürzere Version in
bash
(aber möglicherweise einen Overkill) wie folgt verwenden:Dies funktioniert im
(( ))
arithmetischen Modus. Wenn also der Befehl zurückgegeben wirdsuccess
,$? = 0
wertet der Test((0))
die Tests als ausfalse
, andernfalls wird er zurückgegebentrue
.Um den Erfolg zu testen , können Sie Folgendes verwenden:
aber es ist schon nicht viel kürzer als das erste Beispiel.
quelle
Zum Prüfen Ihrer Befehle auf Fehler :
Inspiriert von Lean Manufacturing:
quelle
if [$ (Befehl)]; dann Echo "Erfolgreich"; fi
quelle
true
gelingtif [ $(true) ]; then echo "succeed"; fi
,succeed
wird aber nicht gedruckt. Tatsächlich wird nie überprüft, ob diescommand
erfolgreich war. Es sollte nurif command
wie in Geirhas Post verwendet werden .$(
)
ist die Befehlsersetzung .[
]
ist ein bedingter Ausdruck . Bei fehlender Wortteilung und Dateinamenerweiterung wird grundsätzlich geprüft, obcommand
die Ausgabe erfolgt ist.