Bash gibt die Variable $? nicht korrekt zurück, wenn die Befehlsausgabe einer lokalen Variablen zugewiesen wird:
test() {
aaa=$(eval "timeout 1s sleep 5s")
echo $? # echoes 124 (!=0 as expected)
local aaa=$(eval "timeout 1s sleep 5s")
echo $? # echoes 0
}
Warum?
Antwort1
local
ist ein eigenständiger Befehl (es ist ein Shell-Builtin), daher erhalten Sie den Rückgabewert von local
, nicht den Rückgabewert der Pipeline in Ihrer Befehlsersetzung. Sie könnten erwägen, die Variable vor der Zuweisung lokal zu deklarieren, wodurch Sie vermeiden, das local
Builtin während derselben Pipeline wie die Befehlsersetzung aufrufen zu müssen, was wiederum verhindert, dass der Exit-Code Ihres Befehls verschleiert wird:
foo() {
local bar
bar=$(baz)
echo $?
}