Diferença entre “cd -” e “cd ~ -”

49

O comando Bash

cd - 

imprime o diretório usado anteriormente e altera para ele.

Por outro lado, o comando Bash

cd ~-

muda diretamente para o diretório usado anteriormente, sem fazer eco de nada.

Essa é a única diferença? Qual é o caso de uso para cada um dos comandos?

    
por dr01 16.12.2016 / 16:22

3 respostas

71

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"/* .

    
por 16.12.2016 / 16:51
12

~- está sujeito à expansão do til (consulte man bash), então o que cd vê é o nome do diretório anterior diretamente. - não é expandido pelo shell, cd o vê diretamente e se comporta conforme documentado:

An argument of - is equivalent to $OLDPWD. 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.

    
por 16.12.2016 / 16:51
4

TL; DR: cd - está incorporado em cd , ~- é uma extensão posterior de ~[name] , não específica de cd .

POSIX.1-2008 Shell & Utilitários define cd - como um caso especial que é específico para o cd comando :

When a - is used as the operand, this shall be equivalent to the command:

cd "$OLDPWD" && pwd

which changes to the previous working directory and then writes its name.

A extensão ~- será expandida para $OLDPWD antes que qualquer comando seja executado e possa ser passado como um argumento para qualquer comando, não apenas cd . É uma extensão posterior em e .

O POSIX.1-2008 Shell & O padrão de utilidades também tem uma explicação elaborada da Expansão de til . O texto é muito específico para permitir ~- como comportamento indefinido dentro do escopo do padrão, onde ~[name] refere-se a $HOME if [name] é a string vazia ou o diretório home do usuário name if name é um nome de usuário válido.

    
por 18.12.2016 / 10:52