pushd, popd vs cd, cd- no bash e zsh

16

Existe uma diferença entre o comportamento de pushd / popd no bash vs zsh? Parece que no zsh cd, o cd se comporta exatamente como pushd / popd (que adiciona o diretório / pops automaticamente quando o cd) enquanto no bash cd não afeta a pilha de diretórios.

Se alguém puder me dar um ponteiro, isso seria ótimo.

dragonxlwang
fonte
Só posso falar com o bash: using cddefine a variável shell OLDPWDpara o diretório anterior e cd -é traduzido para cd "$OLDPWD".
precisa
@glennjackman, obrigado. Isso significa que no bash cd não tem nada a ver com push / popd?
dragonxlwang
Acabei de verificar, e pushdtambém conjuntosOLDPWD
Glenn Jackman
E o dirstack, retornado por dirssempre detém o PCD como o primeiro elemento
Glenn Jackman
sim, mas também faz muito sentido se o cd não tocar em pilhas de dir, que são gerenciadas por pushd / popd no bash.
dragonxlwang

Respostas:

17

Depende. Em zshvocê pode configurar cdpara enviar automaticamente o diretório antigo à pilha de diretórios, mas essa não é a configuração padrão.

Tanto quanto eu posso dizer zshcom configurações padrão se comporta muito semelhante a bash:

  • cd somedir
    • mude o diretório para somedir
    • salve o diretório original em OLDPWD
    • conjunto PWD="somedir"
    • substitua o elemento superior da pilha de diretórios (como mostrado por dirs) por somedir(o número de elementos na pilha não muda).
  • cd -:
    • mude o diretório para $OLDPWD
    • trocar valores de PWDeOLDPWD
    • modifique o elemento superior da pilha de diretórios para refletir (o novo) PWD
  • pushd somedir:
    • mude o diretório para somedir
    • salve o diretório original em OLDPWD
    • conjunto PWD="somedir"
    • pressione somedira pilha de diretórios (estendendo-a por um elemento)
  • popd:
    • salve o diretório original em OLDPWD
    • remova o primeiro elemento da pilha de diretórios
    • altere o diretório para o novo elemento superior da pilha de diretórios
    • definido PWDcomo o novo elemento superior da pilha de diretórios

Nota: Se o diretório de trabalho atual é considerado um elemento da pilha de diretórios difere entre zshe bash. Eu usei bashcomo referência para as listas acima.

  • No bashdiretório de trabalho atual, é considerado o elemento superior da pilha de diretórios. O man 1 bashdiz:

    pushd [-n] [dir]

    […] Adiciona dirà pilha de diretórios na parte superior, tornando-o o novo diretório de trabalho atual como se tivesse sido fornecido como argumento para o cdbuiltin. [...]

    Printing DIRSTACK( echo ${dirstack[@]}) confirma que o primeiro elemento é idêntico a $PWD.

  • No zshdiretório de trabalho atual não faz parte da pilha de diretórios (mas ainda é mostrado com dirs). man 1 zshbuiltinsdiz:

    pushd [ -qsLP ] [ arg ]

    […] Altere o diretório atual e empurre o diretório atual antigo para a pilha de diretórios. No primeiro formulário, altere o diretório atual para arg. [...]

    A impressão dirstack( echo ${dirstack[@]}) e a comparação com a saída de dirsdevem mostrar que isso PWDnão faz parte do `dirstack.

Nos dois shells, dirsimprime o diretório de trabalho atual como o primeiro elemento. Também nos dois shells, o elemento da pilha de diretórios com o índice 1refere-se ao diretório que estava atual antes do último pushd. Isso ocorre porque as matrizes in zshgeralmente são numeradas de 1, enquanto são numeradas de 0in bash. Portanto, há pouca diferença prática


Como dito acima, esse comportamento pode ser modificado em zsh.

Se você definir a AUTO_PUSHDopção em zsh( setopt autopushd) cd somedirse comporta como pushd somedir, o diretório anterior é enviado automaticamente para a pilha de diretórios. Este é provavelmente o caso da sua máquina. Você pode executar setoptpara obter uma lista de opções que não estão definidas da maneira padrão. Veja se autopushdaparece na lista.

Mas isso não modifica cd -para se comportar como popd. Em vez disso, ele apenas entra $PWDna pilha de diretórios e altera o diretório para $OLDPWD. Isso significa que a chamada repetida cd -aumentará a pilha de diretórios ( ($PWD $OLDPWD $PWD $OLDPWD $PWD …)). Se ele realmente se comportar exatamente como popdno seu sistema, eu sugeriria se cdé realmente o builtin ( whence -v cd); é possível que seja substituído por um apelido ou função.

Como a pilha de diretórios aumentará rapidamente com o AUTO_PUSHDrecurso ativado, você poderá limitar seu tamanho configurando o parâmetro DIRSTACKSIZEno tamanho máximo desejado.
Você também pode impedir duplicatas configurando a PUSHD_IGNORE_DUPSopção
Para mais opções, consulte o manual .

Adaephon
fonte
qual é o propósito da pilha de diretórios além de examiná-la dirs?
Xerus
@Xerus Permite voltar aos diretórios visitados anteriormente popdsem a necessidade de digitar (ou mesmo saber) o caminho.
Adaephon