2

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

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

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

3 ответа3

4

Псевдоним - это почти текстовая замена. Поэтому после определения псевдонима ввод 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 .
1

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

Может быть, вы должны использовать функцию вместо:

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

0

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

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

doit () {  
    cd ~/some/dir  
    ./my_app  
    RETVAL=$?  
    cd -  
    return $RETVAL  
}

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .