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


16

C'è una differenza tra il comportamento di pushd / popd in bash vs zsh? Sembra in zsh cd, cd- si comporta esattamente come pushd / popd (che aggiunge automaticamente / pops directory quando cd) mentre in bash cd non influenza lo stack dir.

Se qualcuno mi può dare un puntatore sarebbe fantastico.


Posso solo parlare con bash: usando cdimposta la variabile shell OLDPWDnella directory precedente e cd -viene tradotto in cd "$OLDPWD".
Glenn Jackman,

@glennjackman, grazie. Vuol dire che in bash cd non ha nulla da fare w / pushd / popd?
Dragonxlwang,

Ho appena controllato e pushdimposta ancheOLDPWD
glenn jackman,

E il dirstack, restituito da, dirscontiene sempre il PWD come primo elemento
glenn jackman,

sì, ma ha anche molto senso se cd non tocca gli stack di dir che sono gestiti da pushd / popd in bash.
Dragonxlwang,

Risposte:


17

Dipende. In zshpuoi configurarecd per inviare automaticamente la vecchia directory nello stack di directory, ma non è l'impostazione predefinita.

Per quanto posso dire zshcon le impostazioni predefinite si comporta in modo molto simile a bash:

  • cd somedir
    • cambia directory in somedir
    • salva la directory originale in OLDPWD
    • impostato PWD="somedir"
    • sostituire l'elemento superiore dello stack di directory (come mostrato da dirs) con somedir(il numero di elementi nello stack non cambia).
  • cd -:
    • cambia directory in $OLDPWD
    • valori di scambio di PWDeOLDPWD
    • modifica l'elemento superiore dello stack di directory in modo che rifletta (il nuovo) PWD
  • pushd somedir:
    • cambia directory in somedir
    • salva la directory originale in OLDPWD
    • impostato PWD="somedir"
    • spingere somedirnello stack di directory (estendendolo di un elemento)
  • popd:
    • salva la directory originale in OLDPWD
    • rimuove il primo elemento dello stack di directory
    • cambia directory nel nuovo elemento superiore dello stack di directory
    • impostato PWDsul nuovo elemento superiore dello stack di directory

Nota: se l'attuale directory di lavoro è considerata un elemento dello stack di directory differisce tra zshe bash. Ho usato bashcome riferimento per gli elenchi di cui sopra.

  • Nella bashpresente directory di lavoro è considerato l'elemento principale dello stack di directory. La man 1 bashdice:

    pushd [-n] [dir]

    […] Aggiunge dirallo stack di directory in alto, rendendolo la nuova directory di lavoro corrente come se fosse stata fornita come argomento all'integrato cd. [...]

    Stampa DIRSTACK( echo ${dirstack[@]}) conferma che il primo elemento è identico a $PWD.

  • Nella zshpresente directory di lavoro non fa parte dello stack di directory (ma è ancora mostrato con dirs). man 1 zshbuiltinsdice:

    pushd [ -qsLP ] [ arg ]

    […] Cambia la directory corrente e inserisci la vecchia directory corrente nello stack di directory. Nel primo modulo, modifica la directory corrente in arg. [...]

    Stampare dirstack( echo ${dirstack[@]}) e confrontarlo con l'output di dirsdovrebbe mostrare che PWDnon fa parte di `dirstack.

In entrambe le shell dirsstampa l'attuale directory di lavoro come primo elemento. Anche in entrambe le shell, l'elemento stack di directory con l'indice si 1riferisce alla directory che era corrente prima dell'ultima pushd. Questo perché le matrici in zshsono di solito numerate da 1, mentre sono numerate da 0in bash. Quindi c'è poca differenza pratica


Come detto sopra, questo comportamento può essere modificato in zsh .

Se si imposta l' AUTO_PUSHDopzione in zsh( setopt autopushd) cd somedirsi comporta come pushd somedir, la directory precedente viene automaticamente inserita nello stack di directory. Questo è probabilmente il caso sulla tua macchina. È possibile eseguire setoptper ottenere un elenco di opzioni che non sono impostate nel modo predefinito. Vedi seautopushd appare nell'elenco.

Ma questo non si modifica cd -per comportarsi come popd. Invece spinge semplicemente $PWDnello stack di directory e cambia directory in $OLDPWD. Ciò significa che una chiamata ripetuta cd -farà effettivamente crescere lo stack di directory ( ($PWD $OLDPWD $PWD $OLDPWD $PWD …)). Se in realtà si comporta esattamente come popdsul tuo sistema, suggerirei se cdè effettivamente incorporato (whence -v cd ); è possibile che venga sostituito con un alias o una funzione.

Poiché lo stack di directory crescerà piuttosto rapidamente con AUTO_PUSHDabilitato, è possibile limitarne le dimensioni impostando il parametro DIRSTACKSIZEsulla dimensione massima desiderata.
Puoi anche prevenire i duplicati impostando l' PUSHD_IGNORE_DUPSopzione.
Per ulteriori opzioni, dai un'occhiata al manuale .


qual è lo scopo dello stack di directory oltre a guardarlo tramite dirs?
Xerus,

@Xerus Permette di tornare alle directory precedentemente visitate popdsenza la necessità di digitare (o anche conoscere) il percorso.
Adaephon,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.