Se o script for invocado como ./script
, ele não poderá alterar o diretório atual de seu processo pai. Então o script terá que ser invocado como . ./script
.
Você pode usar o return
incorporado para sair do script e voltar para o chamador. Você só pode fazer isso fora de uma função: em uma função, return
retornaria da função, não do script.
Tenha em mente que, se seu script for originado, ele será executado pelo shell do usuário, não pelo bash, para que os usuários de outros shells (zsh, fish, tcsh,…) não possam usar seu script. É relativamente fácil escrever scripts que funcionem em bash e zsh (inicie seu script com emulate -L ksh 2>/dev/null
e a maioria das coisas funcionará), marcadamente menor para escrever scripts que também funcionem em fish e tcsh.
Uma abordagem alternativa para contornar incompatibilidades de shell é escrever a lógica no programa de sua escolha para analisar argumentos, determinar em qual diretório se transformar, etc. Em seguida, faça o seu programa imprimir o código shell para o shell do chamador e o chamador avalia a saída do seu script. Assim, seu script pode gerar algo como
cd /some/where
ou
echo "Error: blah blah"; false
e seria invocado com
eval "'./script'"
ou um tcsh / fish /… analógico.