Há duas coisas em jogo aqui. Primeiro, o -
sozinho é expandido para o seu diretório anterior. Isso é explicado na seção cd
de man bash
(ênfase minha):
An argument of
-
is converted to $OLDPWD before the directory change is attempted. If a non-empty directory name from CDPATH is used, or if-
is the first argument, and the directory change is successful, the absolute pathname of the new working directory is written to the standard output. The return value is true if the directory was successfully changed; false otherwise.
Assim, um simples cd -
o levará de volta ao seu diretório anterior e imprimirá o nome do diretório. O outro comando está documentado na seção "Expansão do Tilde":
If the tilde-prefix is a
~+
, the value of the shell variable PWD replaces the tilde-prefix. If the tilde-prefix is a~-
, the value of the shell variable OLDPWD, if it is set, is substituted. If the characters following the tilde in the tilde-prefix consist of a number N, optionally prefixed by a+
or a-
, the tilde-prefix is replaced with the corresponding element from the directory stack, as it would be displayed by the dirs builtin invoked with the tilde-prefix as an argument. If the characters following the tilde in the tilde-prefix consist of a number without a leading+
or-
,+
is assumed.
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
Assim, em geral, o -
significa "o diretório anterior". É por isso que cd -
por si só irá levá-lo de volta para onde quer que você estivesse.
A principal diferença é que cd -
é específico do cd
builtin. Se você tentar echo -
, apenas imprimirá -
. O ~-
faz parte da funcionalidade de expansão do til e se comporta de maneira semelhante a uma variável. É por isso que você pode echo ~-
e obter algo significativo. Você também pode usá-lo em cd ~-
, mas também pode usá-lo em qualquer outro comando. Por exemplo, cp ~-/* .
, o que seria equivalente a cp "$OLDPWD"/* .