Pushd、poptとcd、bashとzshのcd

Pushd、poptとcd、bashとzshのcd

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

誰かが私にいくつかのアドバイスを与えることができれば良いでしょう。

ベストアンサー1

時々違うよね以前のディレクトリをディレクトリスタックに自動的にプッシュするようにzsh設定できますが、これはcdデフォルトではありません。

私が知っている限り、zshデフォルト設定は次のように動作しますbash

  • cd somedir
    • ディレクトリを次のように変更します。somedir
    • ソースディレクトリを次の場所に保存します。OLDPWD
    • 置くPWD="somedir"
    • ディレクトリスタックの最上位要素(図を参照dirssomedirを(スタックの同じ数の要素)に置き換えます。
  • cd -:
    • ディレクトリを次のように変更します。$OLDPWD
    • PWD合計値を交換します。OLDPWD
    • 反映するようにディレクトリスタックの最上位要素を変更する(新規)PWD
  • pushd somedir:
    • ディレクトリを次のように変更します。somedir
    • ソースディレクトリを次の場所に保存します。OLDPWD
    • 置くPWD="somedir"
    • somedirディレクトリスタックにプッシュ(1要素ずつ展開)
  • popd:
    • ソースディレクトリを次の場所に保存します。OLDPWD
    • ディレクトリスタックの最初の要素を削除します。
    • ディレクトリをディレクトリスタックの新しいトップレベル要素に変更します。
    • PWDディレクトリスタックの新しいトップレベル要素として設定

メモ:現在の作業ディレクトリがディレクトリスタックの要素と見なされるかどうかは、zshとの間で異なりますbashbash上記のリストを参考にしてください。

  • 現在のbash作業ディレクトリは、ディレクトリスタックの最上位要素と見なされます。説明するman 1 bash

    pushd [-n] [dir]

    dir[...]はディレクトリスタックの先頭に追加され、組み込みcd関数の引数として提供されているように新しい現在の作業ディレクトリになります。 [… ]

    Print DIRSTACKecho ${dirstack[@]})は、最初の要素がと等しいことを確認します$PWD

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

    pushd [ -qsLP ] [ arg ]

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

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

両方のシェルでは、dirs現在の作業ディレクトリが最初の要素として印刷されます。また、両方のシェルでインデックス付けされたディレクトリスタック要素は、1最後のディレクトリより前の現在のディレクトリを参照しますpushd。これは通常、配列内の番号は最初から番号が付けられ、中の配列はzsh最初1から番号が付けられるためです。だから実際の大きな違いはありません0bash


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

()でこのオプションを設定すると、AUTO_PUSHD以前のディレクトリがディレクトリスタックに自動的にプッシュされるように動作します。これはあなたのコンピュータに当てはまるかもしれません。デフォルトモードが設定されていないオプションのリストを取得するために実行できます。リストに表示されていることを確認してください。zshsetopt autopushdcd somedirpushd somedirsetoptautopushd

cd -しかし、これはそのような行動を修正しませんpopd。代わりに、$PWDディレクトリスタックをプッシュしてディレクトリをに変更します$OLDPWD。これはcd -、()への繰り返し呼び出しが実際にディレクトリスタックを増やすことを意味します($PWD $OLDPWD $PWD $OLDPWD $PWD …)popdシステムと同じように機能する場合は、cd実際に組み込み(whence -v cd)されているかどうかを提案したいと思います。エイリアスまたは関数で置き換えることができます。

有効にすると、ディレクトリスタックが非常に高速になり、パラメータを希望の最大サイズにAUTO_PUSHD設定してサイズを制限できます。重複を防ぐためのオプションを設定することもできます。その他のオプションを確認するには、以下を確認してください。DIRSTACKSIZE
PUSHD_IGNORE_DUPS
手動

おすすめ記事