Há duas coisas em jogo aqui. Primeiro, o -
sozinho é expandido para o diretório anterior. Isso é explicado na cd
seção man bash
(ênfase minha):
Um argumento de -
é convertido em $ OLDPWD antes da tentativa de alteração do diretório. Se um nome de diretório não vazio do CDPATH for usado, ou se -
for o primeiro argumento, e a alteração do diretório for bem-sucedida, o nome do caminho absoluto do novo diretório de trabalho será gravado na saída padrão. O valor de retorno é verdadeiro se o diretório foi alterado com sucesso; false caso contrário.
Portanto, um simples cd -
retornará ao diretório anterior e imprimirá o nome do diretório. O outro comando está documentado na seção "Expansão de til":
Se o prefixo til for a ~+
, o valor da variável de shell PWD substituirá o prefixo til. Se o prefixo til for a ~-
, o valor da variável de shell OLDPWD, se estiver definido, será substituído. Se os caracteres que seguem o til no prefixo do til consistirem em um número N, opcionalmente prefixado por a +
ou a -
, o prefixo do til será substituído pelo elemento correspondente da pilha de diretórios, como seria exibido pelos diretórios internos chamados com o prefixo til como argumento. Se os caracteres que seguem o til no prefixo de til consistem em um número sem avanço +
ou -
, +
é assumido.
Isso pode ser mais fácil de entender com um exemplo:
$ pwd
/home/terdon
$ cd ~/foo
$ pwd
/home/terdon/foo
$ cd /etc
$ pwd
/etc
$ echo ~ ## prints $HOME
/home/terdon
$ echo ~+ ## prints $PWD
/etc
$ echo ~- ## prints $OLDPWD
/home/terdon/foo
Então, em geral, os -
meios "o diretório anterior". É cd -
por isso que, por si só, o levará de volta para onde você estava.
A principal diferença é que cd -
é específico para o cd
builtin. Se você tentar echo -
, apenas imprimirá a -
. Isso ~-
faz parte da funcionalidade de expansão til e se comporta de maneira semelhante a uma variável. É por isso que você pode echo ~-
e obtém algo significativo. Você também pode usá-lo, cd ~-
mas também pode usá-lo em qualquer outro comando. Por exemplo, o cp ~-/* .
que seria equivalente acp "$OLDPWD"/* .
cd ~-
.