Observe que o que acontece quando usar return
fora de uma função sem ter source
d o script (por exemplo, return
ing de .bash_profile
) não está documentado em man bash
.
A diferença está em como o código de retorno de um script ou função é registrado internamente em bash
. Se você return
um valor, esse valor é atribuído ao código de retorno do código chamado , por exemplo a chamada de função da qual você retorna ou o comando source
. Como não há tal chamador ao retornar de .bash_profile
durante a inicialização do shell, esse valor é simplesmente descartado. O que você está acessando como $?
é o código de retorno da declaração anterior .
Usando o bash-86.1 da Apple como referência:
Se você source
um script, seu conteúdo será analisado e executado até que uma instrução return
seja encontrada. Seu valor de retorno é registrado separadamente e é de responsabilidade do responsável pela chamada ( execute_command_internal
in bash-3.2/execute_cmd.c
) atribuir seu valor à variável que contém o último código de saída: last_command_exit_value
.
Se for chamado como um script de inicialização, ele será carregado por meio de uma chamada para maybe_execute_file
na função run_startup_files
em bash/shell.c
. Não é a execução regular do comando: Embora o conteúdo do arquivo seja executado corretamente, incluindo o return
final, ninguém se importa com o valor real que você está retornando. É simplesmente descartado.
Então, qual comportamento você está vendo aqui ? Essencialmente o mesmo que se você tivesse chamado return
sem argumento: Como return
simplesmente retornou o código de retorno do comando anterior, que, no seu caso, é o teste com falha.
Como obter o comportamento desejado? Como você não pode exit
de .bash_profile
sem sair do shell, é necessário verificar se o comando imediatamente anterior produz o código de retorno desejado, neste caso:
test -f $HOME/.debug && export profile_bash_profile='.bash_profile' || { true; return; }