#!/bin/bash
function0()
{
local t1=$(exit 1)
echo $t1
}
function0
echo
gibt leeren Wert aus. Ich erwartete:
1
Warum wird der t1
Variable nicht der Rückgabewert des Befehls exit zugewiesen - 1
?
bash
shell
variable
command-substitution
Gilles 'SO - hör auf böse zu sein'
quelle
quelle
$(trap 'printf "::ERRNO:$?"' 0; # now do whatever however
Exit-Code wurde in $ gespeichert ? Variable. Mit Befehl Substitution nur die Ausgabe erfassen, sollten Sie (...) Subshell zu erstellen :
quelle
t1=$?
ist es, sie zu benutzen, nein? und würde nicht$?
durch den Einsatz op überfordert werden? Ich schätze, ichprintf '%d\n' "${t1}"
In
bash
diesem Werk:Dies hat mit der Reihenfolge der Befehlsauswertung und der Variablenzuweisung zu tun.
local
hat einen eigenen Rückgabewert - und es ist der aktuell ausgeführte Befehl, nicht die Befehlsersetzung. Der Grund Dinge wie ...... kann 1 zurückgeben, weil es in diesem Befehl nie eine Rückkehr gibt, mit Ausnahme des Subshell-Laufs, um
$x
den Wert zuzuweisen - es wird$?
also nicht blockiert, wie es in praktisch jedem anderen Fall der Fall ist, in dem Befehlsersetzungen verwendet werden.Wie auch immer, mit
local
ihm nicht bekommen verprügelt - aber wenn man ihm genau zum richtigen Zeitpunkt erwischen - das ist , während die Erweiterungen noch ausgewertet werden und vorlocal
‚s Routinen eine Chance haben , es zu verprügeln - Sie können es nach wie vor zu.... druckt ...
Sie sollten jedoch wissen, dass Sie sich in vielen Shells nicht darauf verlassen können,
$?
dass Sie auf diese Weise die Mitte der Bewertung festlegen. Tatsächlich liegt das wahrscheinlich daran, dass diese Muscheln sich nicht die Mühe machen, zu jedem möglichen Zeitpunkt neu zu bewerten, wie dies vielleicht derbash
Fall ist - was meiner Meinung nach wahrscheinlich besseres Verhalten ist alsbash
das von. Möchten Sie wirklich, dass Ihr Interpreter Werte rekursiv in einer Schleife auswertet, die sehr wahrscheinlich überschrieben werden, bevor Sie die Möglichkeit haben, sie zu verwenden?Wie auch immer, so kannst du das machen.
quelle
Je nachdem, warum Sie versuchen, nur den Exit-Code abzurufen, können Sie auch nur ausführen,
if some-command; then echo "Success $?"; else echo "Failure $?"; fi
was nichts mit der Ausgabe des Befehls zu tun hat. Es wird lediglich der Exit-Code des ausgeführten Befehls ausgewertet. Sie könnenor
(or
$ (around the command and you'll still get the same results. A better example might be
wenn grep -q 'somestring' somefile; dann echo "gefunden somestring Exit-Code ist $?"; Sonst "nicht gefunden somestring Exit-Code ist $?"; Fi`.Sie können auch den Rückkehrcode einer Funktion testen, die entweder ein expliziter
return 3
oder ein impliziter Rückkehrcode sein kann, der das Ergebnis des letzten Befehls ist. In diesem Fall müssen Sie darauf achten, dassecho
am Ende des Befehls kein steht Funktion, andernfalls wird der vorherige Beendigungscode maskiert / zurückgesetzt.Schließlich ein schmutziger Trick, den Sie nicht machen können,
VAR=(SOME_COMMAND)
weilVAR=()
es eine Array-Definition ist, die Sie brauchenVAR=( $(echo 'Some value') )
.quelle