В функции bash я пытаюсь захватить вывод команды вместе с кодом выхода. Как правило, моя форма
some_function() {
local rv=$(some_other_function)
local code=$?
echo "$rv"
return $code
}
но я замечаю, что всякий раз, когда я использую "local", тогда $? ВСЕГДА 0. Как будто он фиксирует результат присваивания, а не вызываемую функцию. Если я не использую local, то все работает как положено:
$ foo() { local rv=$(false); echo "code is $?"; }
$ foo
code is 0
$ foo() { rv=$(false); echo "code is $?"; }
$ foo
code is 1
Может кто-то объяснить это мне? Очевидно, здесь что-то фундаментальное, чего я просто не понимаю.
local rv=$(some_other_function)
- в некоторых оболочках (кроме bash) выводsome_other_function
будет разбит по словам перед передачей вlocal
; первое слово будет присвоеноrv
, а остальные будут обрабатываться как отдельные идентификаторы, которые будут помечены как локальные переменные (за исключением тех, которые не являются действительными идентификаторами). Безопаснее всего всегда заключать подстановку команд в двойные кавычки, напримерlocal rv="$(some_other_function)"
, как и ссылки на переменные. - person Gordon Davisson   schedule 03.03.2021