Каково возвращаемое значение сложного псевдонима в ударе?

Когда я выполняю команду, которая была псевдонимом к ряду команд, какое значение становится возвращенным назад к оболочке? Кроме того, принятие мне определили псевдоним как это:

alias doit 'cd ~/some/dir; ./my_app; cd -'

Как я могу сделать возвращаемое значение этим ./my_app возвращает возвращаемое значение всей искаженной команды?

2
задан 23.09.2010, 21:28

3 ответа

Псевдоним является почти текстовой заменой. Таким образом, после Вашего определения псевдонима, вводя 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.
4
ответ дан 08.12.2019, 05:53

Возвращенное значение является статусом выхода последней выполняемой команды.

Возможно, необходимо использовать функцию вместо этого:

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 команда гарантирует, что никакая глобальная переменная (с тем же именем) не изменяется.

1
ответ дан 08.12.2019, 05:53

Блоки кода в оболочке обычно возвращают возвращаемое значение последней команды в блоке. В Вашем случае, который был бы cd -, который вряд ли когда-либо перестанет работать.

Я думаю, что можно получить то, что Вы хотите путем превращения того псевдонима в функцию оболочки:

doit () {  
    cd ~/some/dir  
    ./my_app  
    RETVAL=$?  
    cd -  
    return $RETVAL  
}
0
ответ дан 08.12.2019, 05:53

Теги

Похожие вопросы