A resposta de Kevin é excelente. Eu escrevi alguns detalhes sobre o que está acontecendo, caso as pessoas estejam procurando um melhor entendimento de por que seu script é necessário para resolver o problema.
A razão pela qual pushd .
quebra o comportamento de cd -
será aparente se nos aprofundarmos no funcionamento do cd e da pilha de diretórios. Vamos colocar alguns diretórios na pilha:
$ mkdir dir1 dir2 dir3
$ pushd dir1
~/dir1 ~
$ pushd../dir2
~/dir2 ~/dir1 ~
$ pushd../dir3
~/dir3 ~/dir2 ~/dir1 ~
$ dirs -v
0 ~/dir3
1 ~/dir2
2 ~/dir1
3 ~
Agora, podemos tentar cd -
para recuperar um diretório:
$ cd -
/home/username/dir2
$ dirs -v
0 ~/dir2
1 ~/dir2
2 ~/dir1
3 ~
Podemos ver que cd -
pulou de volta para o diretório anterior, substituindo stack ~ 0 pelo diretório em que entramos. Podemos voltar com cd -
novamente:
$ cd -
/home/username/dir3
$ dirs -v
0 ~/dir3
1 ~/dir2
2 ~/dir1
3 ~
Repare que saltamos de volta para nosso diretório anterior, mesmo que o diretório anterior não tenha sido listado na pilha de diretórios. Isso ocorre porque cd
usa a variável de ambiente $OLDPWD
para acompanhar o diretório anterior:
$ echo $OLDPWD
/home/username/dir2
Se fizermos pushd .
, enviaremos uma cópia extra do diretório atual para a pilha:
$ pushd .
~/dir3 ~/dir3 ~/dir2 ~/dir1 ~
$ dirs -v
0 ~/dir3
1 ~/dir3
2 ~/dir2
3 ~/dir1
4 ~
Além de criar uma cópia extra do diretório atual na pilha, pushd .
atualizou $OLDPWD
:
$echo $OLDPWD
/home/username/dir3
Portanto, cd -
perdeu seu histórico útil e, agora, apenas o levará para o diretório atual, sem realizar nada.