Ich habe dies in einem Bash-Skript:
exit 3;
exit_code="$?"
if [[ "$exit_code" != "0" ]]; then
echo -e "${r2g_magenta}Your r2g process is exiting with code $exit_code.${r2g_no_color}";
exit "$exit_code";
fi
Es sieht so aus, als würde es direkt nach dem Befehl exit beendet, was sinnvoll ist. Ich habe mich gefragt, ob es einen einfachen Befehl gibt, der einen Exit-Code bereitstellen kann, ohne sofort zu beenden.
Ich wollte raten:
exec exit 3
aber es gibt eine Fehlermeldung : exec: exit: not found
. Was kann ich tun? :) :)
bash
shell-script
exec
exit
exit-status
G-Man sagt "Reinstate Monica"
quelle
quelle
exec exit 3
ist kein bueno, ich bekomme"exec: exit: not found"
exit_code=3
dieexit 3
Linie ganz setzen und eliminieren ?$?
Variable festgelegt wird, dieses Skript jedoch nicht beendet wird ?"Antworten:
Wenn Sie ein Skript haben, das ein Programm ausführt und den Exit-Status des Programms (mit
$?
) überprüft, und Sie dieses Skript testen möchten, indem Sie etwas tun , das dazu führt$?
, dass ein bekannter Wert festgelegt wird (z. B.3
), tun Sie dies einfachDie Klammern erstellen eine Unterschale. Dann
exit
bewirkt der Befehl, dass diese Sub-Shell mit dem angegebenen Exit-Status beendet wird.quelle
exit_code="3"
zum Testenexit
ist eine eingebaute Bash, also kannst du es nichtexec
. Per Bashs Handbuch :Zusammengenommen würde ich sagen, dass Ihre einzige Option darin besteht, Ihren gewünschten Exit-Status in einer Variablen zu speichern und dann
exit $MY_EXIT_STATUS
gegebenenfalls.quelle
$?
(obwohl ich nicht wirklich sicher bin, warum Sie das tun würden), scheint dies eine solide Antwort zu sein. Wenn Sie nur einen erfolglosen Wert festlegen möchten,false
ist dies eine weitere Option.Sie können eine Funktion schreiben, die den als Argument angegebenen Status zurückgibt oder
255
wenn keiner angegeben ist. (Ich nenne es,ret
weil es seinen Wert "zurückgibt".)und
ret
anstelle Ihres Anrufs zu verwendenexit
. Dies vermeidet die Ineffizienz beim Erstellen der Unter-Shell in der aktuell akzeptierten Antwort.Einige Messungen.
auf meinem Computer dauert etwa 3,5 Sekunden.
Auf meinem Computer dauert es ungefähr 0,051 Sekunden, 70-mal schneller. Wenn Sie die Standardbehandlung verwenden, ist sie immer noch 60-mal schneller. Offensichtlich hat die Schleife etwas Overhead. Wenn ich den Körper der Schleife so ändere, dass er nur ist,
:
oder wenn sichtrue
die Zeit auf 0,025 halbiert, ist eine vollständig leere Schleife eine ungültige Syntax. Das Hinzufügen;:
zur Schleife zeigt, dass dieser minimale Befehl 0,007 Sekunden dauert, sodass der Schleifen-Overhead etwa 0,018 beträgt. Das Subtrahieren dieses Overheads von den beiden Tests zeigt, dass dieret
Lösung über 100-mal schneller ist.Natürlich ist dies eine synthetische Messung, aber die Dinge summieren sich. Wenn Sie alles 100-mal langsamer machen, als es sein muss, erhalten Sie langsame Systeme. 0.0
quelle
Über
exec exit 3
... es würde versuchen, einen externen Befehl namens aufzurufenexit
, aber es gibt keinen, so dass Sie den Fehler erhalten. Es verfügt über einen externen Befehl anstelle eines in die Schale eingebaut sein, daexec
ersetzt die Schale vollständig. Was auch bedeutet , dass selbst wenn Sie einen externen Befehl aufgerufen hatteexit
,exec exit 3
würde nicht zurückkehren Ihre Shell - Skript , um fortzufahren, da die Schale nicht mehr da sein würde .quelle
exec bash -c "exit 3"
, aber im Moment kann ich mir keinen Grund vorstellen, dies zu tun, anstatt nurexit 3
.exec
"ing" oder "nurexit
" ing das Skript stoppen, was nicht so aussah, wie es die Frage wollte.Sie können dies mit Awk tun:
Oder Sed:
quelle
sh -c 'exit 9'
(exit 9)
in der akzeptierten Antwort tun