web-dev-qa-db-ja.com

pushd、popd vs cd、cd- in bashおよびzsh

Bashとzshでのpushd/popdの動作に違いはありますか?これはzsh cdのようですが、cd-はpushd/popd(cd時にディレクトリを自動的に追加/ポップします)とまったく同じように動作しますが、bash cdではdirスタックに影響しません。

誰かが私に素晴らしいポインタを与えることができるなら。

16
dragonxlwang

場合によります。 zshでは、cdを設定して、ディレクトリスタック上の古いディレクトリを自動的にプッシュできますが、これはデフォルト設定ではありません。

私が知る限り、デフォルト設定でのzshbashと非常によく似た動作をします。

  • cd somedir
    • ディレクトリをsomedirに変更します
    • 元のディレクトリをOLDPWDに保存します
    • セットPWD="somedir"
    • ディレクトリスタックの最上位の要素(dirsで示される)をsomedirに置き換えます(スタック上の要素の数は変わりません)。
  • cd -
    • ディレクトリを$OLDPWDに変更します
    • PWDOLDPWDの値を入れ替える
    • (新しい)PWDを反映するようにディレクトリスタックの最上位要素を変更する
  • pushd somedir
    • ディレクトリをsomedirに変更します
    • 元のディレクトリをOLDPWDに保存します
    • セットPWD="somedir"
    • somedirをディレクトリスタックにプッシュします(1要素拡張します)。
  • popd
    • 元のディレクトリをOLDPWDに保存します
    • ディレクトリスタックの最初の要素を削除する
    • ディレクトリをディレクトリスタックの新しい最上位要素に変更する
    • PWDをディレクトリスタックの新しい最上位要素に設定します。

注:現在の作業ディレクトリがディレクトリスタックの要素と見なされるかどうかは、zshbashで異なります。上記のリストのリファレンスとしてbashを使用しました。

  • bashでは、現在の作業ディレクトリがディレクトリスタックの最上位の要素と見なされます。 man 1 bashさんのコメント:

    pushd [-n] [dir]

    […] dirを最上部のディレクトリスタックに追加し、cdビルトインへの引数として指定された場合と同じように、現在の作業ディレクトリを新しくします。 […]

    DIRSTACKecho ${dirstack[@]})を印刷すると、最初の要素が$PWDと同じであることを確認できます。

  • zshでは、現在の作業ディレクトリはディレクトリスタックの一部ではありません(ただし、dirsで引き続き表示されます)。 man 1 zshbuiltinsさんのコメント:

    pushd [ -qsLP ] [ arg ]

    […]現在のディレクトリを変更し、古い現在のディレクトリをディレクトリスタックにプッシュします。最初の形式で、現在のディレクトリをargに変更します。 […]

    dirstackecho ${dirstack[@]})を出力してdirsの出力と比較すると、PWDが `dirstackの一部ではないことがわかります。

両方のシェルでdirsは現在の作業ディレクトリを最初の要素として出力します。また、両方のシェルで、インデックス1のディレクトリスタックエレメントは、最後のpushdより前の現在のディレクトリを参照します。これは、zshの配列には通常1から番号が付けられ、bash0から番号が付けられるためです。ですから実用的な違いはほとんどありません


上記のように、この動作はzshで変更できます。

zshAUTO_PUSHD)でsetopt autopushdオプションを設定すると、cd somedirpushd somedirのように動作し、前のディレクトリがディレクトリスタックに自動的にプッシュされます。これはおそらくあなたのマシンの場合です。 setoptを実行すると、デフォルトの方法で設定されていないオプションのリストを取得できます。 autopushdがリストに表示されるかどうかを確認してください。

ただし、これによってcd -popdのように動作するように変更されることはありません。代わりに、$PWDをディレクトリスタックにプッシュし、ディレクトリを$OLDPWDに変更します。つまり、cd -を繰り返し呼び出すと、実際にディレクトリスタック(($PWD $OLDPWD $PWD $OLDPWD $PWD …))が大きくなります。システムで実際にpopdのように動作する場合、cdが実際に組み込み(whence -v cd)であるかどうかをお勧めします。エイリアスまたは関数に置き換えられる可能性があります。

AUTO_PUSHDを有効にすると、ディレクトリスタックが急速に大きくなるため、パラメーターDIRSTACKSIZEを目的の最大サイズに設定することで、そのサイズを制限できます。
PUSHD_IGNORE_DUPSオプションを設定して、重複を防ぐこともできます。
その他のオプションについては マニュアル をご覧ください。

18
Adaephon