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

11

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

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

    
por dragonxlwang 29.03.2016 / 22:19

1 resposta

14

Depende. Em zsh você pode configurar cd para empurrar o diretório antigo na pilha de diretórios automaticamente, mas não é a configuração padrão.

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

  • %código%
    • altere o diretório para cd somedir
    • salve o diretório original em somedir
    • definir OLDPWD
    • substitua o elemento principal da pilha de diretórios (conforme mostrado por PWD="somedir" ) com dirs (o número de elementos na pilha não é alterado).
  • %código%:
    • altere o diretório para somedir
    • valores de swap de cd - e $OLDPWD
    • modifica o elemento principal da pilha de diretórios para refletir (o novo) PWD
  • %código%:
    • altere o diretório para OLDPWD
    • salvar o diretório original em PWD
    • definir pushd somedir
    • empurre somedir para a pilha de diretórios (estendendo-o por um elemento)
  • %código%:
    • salvar o diretório original em OLDPWD
    • remove o primeiro elemento da pilha de diretórios
    • altere o diretório para o novo elemento superior da pilha de diretórios
    • defina PWD="somedir" como o novo elemento principal da pilha de diretórios

Observação: Se o diretório de trabalho atual é considerado um elemento da pilha de diretórios, ele é diferente entre somedir e popd . Eu usei OLDPWD como referência para as listas acima.

  • Em PWD , o diretório de trabalho atual é considerado o principal elemento da pilha de diretórios. O zsh diz:

    pushd [-n] [dir]

    […] Adds dir to the directory stack at the top, making it the new current working directory as if it had been supplied as the argument to the cd builtin. […]

    A impressão bash ( bash ) confirma que o primeiro elemento é idêntico a bash .

  • Em man 1 bash , o diretório de trabalho atual não faz parte da pilha de diretórios (mas ainda é mostrado com DIRSTACK ). echo ${dirstack[@]} diz:

    pushd [ -qsLP ] [ arg ]

    […] Change the current directory, and push the old current directory onto the directory stack. In the first form, change the current directory to arg. […]

    Imprimir $PWD ( zsh ) e compará-lo com a saída de dirs deve mostrar que man 1 zshbuiltins não faz parte de 'dirstack.

Em ambos os shells, o dirstack imprime o diretório de trabalho atual como o primeiro elemento. Também em ambos os shells, o elemento da pilha de diretórios com o índice echo ${dirstack[@]} refere-se ao diretório que era atual antes do último dirs . Isso ocorre porque as matrizes em PWD geralmente são numeradas de dirs , enquanto são numeradas de 1 in pushd . Portanto, há pouca diferença prática

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

Se você definir a opção 1 em 0 ( bash ) zsh se comporta como AUTO_PUSHD , o diretório anterior é colocado automaticamente na pilha de diretórios. Este é provavelmente o caso da sua máquina. Você pode executar zsh para obter uma lista de opções que não estão definidas como padrão. Veja se setopt autopushd aparece na lista.

Mas isso não modifica cd somedir para se comportar como pushd somedir . Em vez disso, ele simplesmente envia setopt para a pilha de diretórios e altera o diretório para autopushd . Isso significa que chamar repetidamente cd - aumentará a pilha de diretórios ( popd ). Se ele realmente se comportar exatamente como $PWD em seu sistema, sugiro se $OLDPWD for realmente o construído ( cd - ); é possível que seja substituído por um alias ou função.

Como a pilha de diretórios aumentará rapidamente com ($PWD $OLDPWD $PWD $OLDPWD $PWD …) habilitada, você poderá limitar seu tamanho definindo o parâmetro popd para o tamanho máximo desejado.
Você também pode evitar duplicatas definindo a opção cd .
Para mais opções, consulte o manual .

    
por 30.03.2016 / 11:34