Bash's return()
können nur numerische Argumente zurückgeben. In jedem Fall wird standardmäßig der Exit-Status des letzten Befehlslaufs zurückgegeben. Alles was Sie wirklich brauchen ist:
#!/usr/bin/env bash
install_auto() {
apt-get -h > /dev/null 2>&1
if [ $? -eq 0 ] ; then
sudo apt-get install --assume-yes $@
fi
}
Sie müssen keinen explizit zurückzugebenden Wert festlegen, da standardmäßig eine Funktion zurückgegeben wird $?
. Dies funktioniert jedoch nicht, wenn der erste apt
Befehl fehlgeschlagen ist und Sie nicht in die if
Schleife gegangen sind . Verwenden Sie Folgendes, um es robuster zu machen:
#!/usr/bin/env bash
install_auto() {
apt-get -h > /dev/null 2>&1
ret=$?
if [ $ret -eq 0 ] ; then
## If this is executed, the else is ignored and $? will be
## returned. Here, $?will be the exit status of this command
sudo apt-get install --assume-yes $@
else
## Else, return the exit value of the first apt-get
return $ret
fi
}
Die allgemeine Regel lautet, dass Sie den Exit-Status in einer Variablen speichern und die Variable zurückgeben müssen, damit eine Funktion den Beendigungsstatus eines bestimmten Jobs und nicht unbedingt den zuletzt ausgeführten zurückgibt:
function foo() {
run_a_command arg1 arg2 argN
## Save the command's exit status into a variable
return_value= $?
[the rest of the function goes here]
## return the variable
return $return_value
}
EDIT: Wie @gniourf_gniourf in den Kommentaren betonte, können Sie das Ganze erheblich vereinfachen, indem Sie &&
:
install_auto() {
apt-get -h > /dev/null 2>&1 &&
sudo apt-get install --assume-yes $@
}
Der Rückgabewert dieser Funktion ist einer von:
- Wenn dies
apt-get -h
fehlschlägt, wird der Exit-Code zurückgegeben
- Wenn dies
apt-get -h
erfolgreich ist, wird der Exit-Code von zurückgegeben sudo apt-get install
.
return $?
in der nächsten Zeile Ihres Beispiels nachsudo apt-get ...
könnte ausreichen. Ist das richtig? Vielen Dank