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.