Qual é o valor de retorno de um alias complexo no bash?

2

Quando executo um comando que tenha sido um alias para uma série de comandos, qual valor é retornado ao shell? Além disso, supondo que eu tenha um alias definido assim:

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

Como posso fazer o valor de retorno que ./my_app retorna o valor de retorno de todo o comando de alias?

    
por heavyd 23.09.2010 / 20:28

3 respostas

4

Um alias é quase uma substituição textual. Portanto, após a definição do alias, digitar doit equivale a digitar cd ~/some/dir; ./my_app; cd - . Esta é uma lista de comandos sintaticamente correta, e seu valor de retorno é o valor de retorno do último comando na sequência, aqui cd - .

Outras respostas mostram uma maneira geral de salvar o status de um comando intermediário e retorná-lo. No entanto, neste caso específico, há uma maneira melhor de expressar essa seqüência de ações: em vez de mudar para outro diretório e, em seguida, voltar, execute a ação que requer um diretório atual diferente dentro de um subshell, para que o diretório atual do shell não muda nada.

doit () {
  (cd ~/some/dir && ./my_app "$@")
}

Eu fiz duas melhorias adicionais:

  • Use && em vez de ; entre os comandos, para não tentar executar my_app se o comando cd falhar.
  • Permitir que os argumentos sejam passados para my_app : se você executar doit foo bar , my_app será chamado com os dois argumentos foo e bar .
por 23.09.2010 / 21:40
1

O valor retornado é o status de saída do último comando executado.

Talvez você deva usar uma função:

function doit
{
    cd ~/some/dir
    ./my_app
    local X=$?
    cd -
    return $X
}

De man Bash :

$? Expands to the status of the most recently executed foreground pipeline.

Nota: O comando local garante que nenhuma variável global (com o mesmo nome) seja modificada.

    
por 23.09.2010 / 20:58
0

Blocos de código no shell geralmente retornam o valor de retorno do último comando no bloco. No seu caso, isso seria cd - , o que é improvável que falhe.

Acho que você pode conseguir o que deseja transformando esse alias em uma função de shell:

doit () {  
    cd ~/some/dir  
    ./my_app  
    RETVAL=$?  
    cd -  
    return $RETVAL  
}
    
por 23.09.2010 / 20:58