Bashとzshでのpushd/popdの動作に違いはありますか?これはzsh cdのようですが、cd-はpushd/popd(cd時にディレクトリを自動的に追加/ポップします)とまったく同じように動作しますが、bash cdではdirスタックに影響しません。
誰かが私に素晴らしいポインタを与えることができるなら。
場合によります。 zsh
では、cd
を設定して、ディレクトリスタック上の古いディレクトリを自動的にプッシュできますが、これはデフォルト設定ではありません。
私が知る限り、デフォルト設定でのzsh
はbash
と非常によく似た動作をします。
cd somedir
somedir
に変更しますOLDPWD
に保存しますPWD="somedir"
dirs
で示される)をsomedir
に置き換えます(スタック上の要素の数は変わりません)。cd -
:$OLDPWD
に変更しますPWD
とOLDPWD
の値を入れ替えるPWD
を反映するようにディレクトリスタックの最上位要素を変更するpushd somedir
:somedir
に変更しますOLDPWD
に保存しますPWD="somedir"
somedir
をディレクトリスタックにプッシュします(1要素拡張します)。popd
:OLDPWD
に保存しますPWD
をディレクトリスタックの新しい最上位要素に設定します。注:現在の作業ディレクトリがディレクトリスタックの要素と見なされるかどうかは、zsh
とbash
で異なります。上記のリストのリファレンスとしてbash
を使用しました。
bash
では、現在の作業ディレクトリがディレクトリスタックの最上位の要素と見なされます。 man 1 bash
さんのコメント:
pushd [-n] [dir]
[…]
dir
を最上部のディレクトリスタックに追加し、cd
ビルトインへの引数として指定された場合と同じように、現在の作業ディレクトリを新しくします。 […]
DIRSTACK
(echo ${dirstack[@]}
)を印刷すると、最初の要素が$PWD
と同じであることを確認できます。
zsh
では、現在の作業ディレクトリはディレクトリスタックの一部ではありません(ただし、dirs
で引き続き表示されます)。 man 1 zshbuiltins
さんのコメント:
pushd [ -qsLP ] [ arg ]
[…]現在のディレクトリを変更し、古い現在のディレクトリをディレクトリスタックにプッシュします。最初の形式で、現在のディレクトリをargに変更します。 […]
dirstack
(echo ${dirstack[@]}
)を出力してdirs
の出力と比較すると、PWD
が `dirstackの一部ではないことがわかります。
両方のシェルでdirs
は現在の作業ディレクトリを最初の要素として出力します。また、両方のシェルで、インデックス1
のディレクトリスタックエレメントは、最後のpushd
より前の現在のディレクトリを参照します。これは、zsh
の配列には通常1
から番号が付けられ、bash
の0
から番号が付けられるためです。ですから実用的な違いはほとんどありません
上記のように、この動作はzsh
で変更できます。
zsh
(AUTO_PUSHD
)でsetopt autopushd
オプションを設定すると、cd somedir
はpushd somedir
のように動作し、前のディレクトリがディレクトリスタックに自動的にプッシュされます。これはおそらくあなたのマシンの場合です。 setopt
を実行すると、デフォルトの方法で設定されていないオプションのリストを取得できます。 autopushd
がリストに表示されるかどうかを確認してください。
ただし、これによってcd -
がpopd
のように動作するように変更されることはありません。代わりに、$PWD
をディレクトリスタックにプッシュし、ディレクトリを$OLDPWD
に変更します。つまり、cd -
を繰り返し呼び出すと、実際にディレクトリスタック(($PWD $OLDPWD $PWD $OLDPWD $PWD …)
)が大きくなります。システムで実際にpopd
のように動作する場合、cd
が実際に組み込み(whence -v cd
)であるかどうかをお勧めします。エイリアスまたは関数に置き換えられる可能性があります。
AUTO_PUSHD
を有効にすると、ディレクトリスタックが急速に大きくなるため、パラメーターDIRSTACKSIZE
を目的の最大サイズに設定することで、そのサイズを制限できます。PUSHD_IGNORE_DUPS
オプションを設定して、重複を防ぐこともできます。
その他のオプションについては マニュアル をご覧ください。