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

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

O comando Bash

cd - 

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

Por outro lado, o comando Bash

cd ~-

muda diretamente para o diretório usado anteriormente, sem ecoar nada.

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

Responder1

Há duas coisas em jogo aqui. Primeiro, o -arquivo individual é expandido para o diretório anterior. Isso é explicado na cdseção de 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 de 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 será verdadeiro se o diretório tiver sido alterado com êxito; falso caso contrário.

Portanto, um simples cd -irá movê-lo de volta ao diretório anterior e imprimir o nome do diretório. O outro comando está documentado na seção "Expansão Tilde":

Se o prefixo de til for a ~+, o valor da variável shell PWD substitui o prefixo de til. Se o prefixo til for a ~-, o valor da variável shell OLDPWD, se estiver definido, será substituído. Se os caracteres após o til no prefixo de til consistirem em um número N, opcionalmente prefixado por a +ou a -, o prefixo de til será substituído pelo elemento correspondente da pilha de diretórios, como seria exibido pelo dirs interno invocado com o prefixo til como argumento. Se os caracteres após o til no prefixo do til consistirem em um número sem um +ou inicial -, +é 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, -significa "o diretório anterior". É por isso que cd -por si só o levará de volta para onde quer que estivesse.

A principal diferença é que cd -é específico para o cdbuiltin. Se você tentar, echo -apenas imprimirá um arquivo -. 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 ~-obter algo significativo. Você também pode usá-lo, cd ~-mas também pode usá-lo em qualquer outro comando. Por exemplo, cp ~-/* .o que seria equivalente acp "$OLDPWD"/* .

Responder2

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

Um argumento de - é equivalente a $OLDPWD. Se um nome de diretório não vazio de 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.

Responder3

DR: cd -está integrado cd, ~-é uma extensão posterior do ~[name], não específico do cd.

POSIX.1-2008 Shell e utilitáriosdefine cd -como um caso especial que éespecíficopara ocdcomando:

Quando a -for usado como operando, será equivalente ao comando:

cd "$OLDPWD" && pwd

que muda para o diretório de trabalho anterior e então escreve seu nome.

A ~-extensão será expandida para $OLDPWDantes de qualquer comando ser executado e pode ser passada como argumento para qualquer comando, não apenas cd. É uma extensão posterior eme.

O padrão POSIX.1-2008 Shell & Utilities mencionado acima também temuma explicação elaborada da expansão Tilde. O texto é muito específico para permitir ~-um comportamento indefinido dentro do escopo do padrão, onde ~[name]se refere a $HOMEif [name]é a string vazia ou ao diretório inicial do usuário nameif nameé um nome de usuário válido.

informação relacionada