
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 cd
seçã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 cd
builtin. 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 cd
vê é o nome do diretório anterior diretamente. -
não é expandido pelo shell, cd
vê-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 ocd
comando:
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 $OLDPWD
antes de qualquer comando ser executado e pode ser passada como argumento para qualquer comando, não apenas cd
. É uma extensão posterior emkshefesta.
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 $HOME
if [name]
é a string vazia ou ao diretório inicial do usuário name
if name
é um nome de usuário válido.