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


16

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

誰かが私に素晴らしいポインタをくれるとしたら。


bashにしか話せません:を使用cdすると、シェル変数OLDPWDが前のディレクトリに設定され、cd -に変換されcd "$OLDPWD"ます。
グレンジャックマン

@glennjackman、ありがとう。これは、bash cdでpushd / popdを実行しても何も実行されないことを意味しますか?
dragonxlwang

私はちょうどチェックし、pushd設定しますOLDPWD
グレンジャックマン

そしてdirstackはdirs常にPWDを最初の要素として保持します
グレンジャックマン

はい、しかし、cdがbashのpushd / popdによって管理されるdirスタックに触れない場合にも、非常に意味があります。
dragonxlwang

回答:


17

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

zshデフォルト設定でわかる限り、動作は次のようになりますbash

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

注:現在の作業ディレクトリがディレクトリスタックの要素と見なされるかどうかは、との間zshで異なりますbashbash上記のリストの参照として使用しました。

  • ではbash、現在の作業ディレクトリディレクトリスタックの最上位要素であると考えられています。man 1 bashこう述べています。

    pushd [-n] [dir]

    […] dir最上部のディレクトリスタックに追加し、cd組み込みの引数として提供されたかのように、新しい現在の作業ディレクトリにします。[…]

    Printing DIRSTACKecho ${dirstack[@]})は、最初の要素がと同一であることを確認し$PWDます。

  • zsh現在の作業ディレクトリのディレクトリ・スタックの一部(まだと示されていませんdirs)。man 1 zshbuiltins言う:

    pushd [ -qsLP ] [ arg ]

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

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

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


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

あなたが設定した場合AUTO_PUSHDにオプションをzshsetopt autopushdcd 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ます。
その他のオプションについては、マニュアルをご覧ください。


ディレクトリスタックの目的は、それを経由して見ること以外にdirs何ですか?
ゼロス

@Xerus popdパスを入力する(または知る)必要なく、以前にアクセスしたディレクトリに戻ることができます。
アデフォン
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.