bashとzshでpushd / popdの動作に違いはありますか? zsh cd では、cd- は Pushd/popd とまったく同じように動作するように見えますが (cd に /pops ディレクトリを自動的に追加)、bash cd ではディレクトリスタックには影響しません。
誰かが私にいくつかのアドバイスを与えることができれば良いでしょう。
答え1
時々違うよね以前のディレクトリをディレクトリスタックに自動的にプッシュするように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
関数の引数として提供されているように新しい現在の作業ディレクトリになります。 [… ]Print
DIRSTACK
(echo ${dirstack[@]}
)は、最初の要素がと等しいことを確認します$PWD
。現在の
zsh
作業ディレクトリはディレクトリスタックの一部ではありません(ただし、まだ表示されますdirs
)。man 1 zshbuiltins
説明する:pushd [ -qsLP ] [ arg ]
[...]は現在のディレクトリを変更し、以前の現在のディレクトリをディレクトリスタックにプッシュします。最初の形式では、現在のディレクトリをargに変更します。 [… ]
印刷
dirstack
(echo ${dirstack[@]}
)して出力と比較すると、 `dirstack.hの一部ではdirs
ないことがわかりますPWD
。
両方のシェルでは、dirs
現在の作業ディレクトリが最初の要素として印刷されます。また、両方のシェルでインデックス付けされたディレクトリスタック要素は、1
最後のディレクトリより前の現在のディレクトリを参照しますpushd
。これは通常、配列内の番号は最初から番号が付けられ、中の配列はzsh
最初1
から番号が付けられるためです。だから実際の大きな違いはありません0
bash
上記のように、この動作はで修正できますzsh
。
()でこのオプションを設定すると、AUTO_PUSHD
以前のディレクトリがディレクトリスタックに自動的にプッシュされるように動作します。これはあなたのコンピュータに当てはまるかもしれません。デフォルトモードが設定されていないオプションのリストを取得するために実行できます。リストに表示されていることを確認してください。zsh
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
手動。