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 para cada um dos comandos?
bash
directory
cd-command
pushd
dr01
fonte
fonte
cd ~-
.Respostas:
Há duas coisas em jogo aqui. Primeiro, o
-
sozinho é expandido para o diretório anterior. Isso é explicado nacd
seçãoman bash
(ênfase minha):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":Isso pode ser mais fácil de entender com um exemplo:
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 ocd
builtin. Se você tentarecho -
, 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ê podeecho ~-
e obtém algo significativo. Você também pode usá-lo,cd ~-
mas também pode usá-lo em qualquer outro comando. Por exemplo, ocp ~-/* .
que seria equivalente acp "$OLDPWD"/* .
fonte
set -x
para imprimir o comando expandido antes de executá-lo, pode ser útil ilustrar a diferença (ou pode ser extremamente barulhento quando você não está fazendo isso sozinho, uma etapa de cada vez).cd ~-/..
funciona,cd -/..
não!~-
está sujeito à expansão til (consulte man bash), então o quecd
vê é o nome do diretório anterior diretamente.-
não é expandido pelo shell, ocd
vê diretamente e se comporta como documentado:fonte
TL; DR:
cd -
está embutidocd
,~-
é uma extensão posterior~[name]
, não específica paracd
.O POSIX.1-2008 Shell & Utilities define
cd -
como um caso especial específico para ocd
comando :A
~-
extensão será expandida para$OLDPWD
antes de qualquer comando ser executado e pode ser passada como argumento para qualquer comando, não apenascd
. É uma extensão posterior no ksh e no bash .O mencionado padrão POSIX.1-2008 Shell & Utilities também possui uma explicação elaborada da expansão Tilde . A redação é muito específica para permitir um
~-
comportamento indefinido no escopo do padrão, onde~[name]
se refere a$HOME
se[name]
é a sequência vazia ou o diretório inicial do usuárioname
sename
for um nome de usuário válido.fonte