Когда я выполняю команду, которая была псевдонимом к ряду команд, какое значение становится возвращенным назад к оболочке? Кроме того, принятие мне определили псевдоним как это:
alias doit 'cd ~/some/dir; ./my_app; cd -'
Как я могу сделать возвращаемое значение этим ./my_app
возвращает возвращаемое значение всей искаженной команды?
Псевдоним является почти текстовой заменой. Таким образом, после Вашего определения псевдонима, вводя doit
эквивалентно вводу cd ~/some/dir; ./my_app; cd -
. Это - синтаксически корректный список команд, и его возвращаемое значение является возвращаемым значением последней команды в последовательности, здесь cd -
.
Другие ответы показывают общий способ сохранить состояние промежуточной команды и возвратить его. Однако в этом конкретном случае, существует лучший способ выразить эту последовательность действий: вместо того, чтобы измениться на другой каталог и затем возврат, выполните действие, которое требует другого текущего каталога в подоболочке, так, чтобы текущий каталог оболочки не изменялся вообще.
doit () {
(cd ~/some/dir && ./my_app "$@")
}
Я сделал два дополнительных улучшения:
&&
вместо ;
между командами, чтобы не попытаться выполниться my_app
если cd
команда перестала работать.my_app
: если Вы работаете doit foo bar
, my_app
вызывается с этими двумя аргументами foo
и bar
.Возвращенное значение является статусом выхода последней выполняемой команды.
Возможно, необходимо использовать функцию вместо этого:
function doit { cd ~/some/dir ./my_app local X=$? cd - return $X }
От man Bash
:
$? Expands to the status of the most recently executed foreground pipeline.
Примечание: local
команда гарантирует, что никакая глобальная переменная (с тем же именем) не изменяется.
Блоки кода в оболочке обычно возвращают возвращаемое значение последней команды в блоке. В Вашем случае, который был бы cd -
, который вряд ли когда-либо перестанет работать.
Я думаю, что можно получить то, что Вы хотите путем превращения того псевдонима в функцию оболочки:
doit () {
cd ~/some/dir
./my_app
RETVAL=$?
cd -
return $RETVAL
}