Bash gibt die Variable $? nicht korrekt zurück

Bash gibt die Variable $? nicht korrekt zurück

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

localist 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 localBuiltin 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 $?
}

verwandte Informationen