Seu primeiro script não altera o diretório. Eu não sei o que faz você pensar, mas cd
dentro de um script executado irá nunca afetar o shell pai. É assim que funciona.
A única maneira de alterar o diretório do shell pai é se você o contratar, em vez de executá-lo. Salvei seu primeiro script como foo.sh
e o executei em $HOME
:
$ pwd
/home/terdon
$ foo.sh 1
/home/terdon/code/mydir-1.6_
$ pwd
/home/terdon
Como você pode ver, o diretório é alterado dentro do script, mas o PWD do shell pai permanece inalterado. Agora, se você comprá-lo, funciona como você espera:
$ . ~/scripts/foo.sh
bash: [: =: unary operator expected
/home/terdon/code/mydir
$ pwd
/home/terdon/code/mydir
Portanto, se você quiser que o seu script altere o diretório de seu shell pai, você precisa criar a fonte para não executá-lo. No entanto, se é isso que você está tentando fazer, você quer escrever uma função, não um script:
changeDir(){
targetDir="mydir"
if [ "$1" = "1" ]; then
targetDir="mydir-1.6_"
fi
\cd "$targetDir"
}
Adicione o acima ao seu ~/.bashrc
e use isso em vez de um script. As funções sempre afetam o shell que as executa, de modo que ele alterará seu diretório como você deseja.
Observe que estou usando \cd
em vez de cd
. Isso é para o caso de seu cd
estar aliado a algo . Observe também que alterei um pouco seu script para evitar o bash: [: =: unary operator expected
que você estava obtendo com sua abordagem original. Em scripts de shell, é essencial para sempre citar suas variáveis. Nesse caso, quando $1
estava vazio, o script estava tentando ser executado:
$ if [ = 1 ]; then targetDir="mydir-1.6_"; fi
bash: [: =: unary operator expected
O que, é claro, dá um erro, já que não há nada para comparar. Citando $1
, você está comparando a string vazia e isso funcionará como esperado.