「-n」オプションを使用した popd および pushd の動作

「-n」オプションを使用した popd および pushd の動作

私は bash (Cygwin、マニュアル ページには「GNU bash 4.1」と記載されています) で実験してきましたpushdpopd、マニュアル ページの動作が正確に一致していないようです。

の場合pushd、コマンド

% pushd +1

スタックを回転させ、作業ディレクトリを変更します。

% pushd -n +1

スタックを回転させるだけです。これは man ページと一致しているようです。

しかし

% popd +1 

スタックからエントリを削除しますが、作業ディレクトリは変更しません ("-n" が指定されていない場合でも)。これは、以下に引用したマニュアル ページと一致していないようです。

引数が指定された場合、その意味は次のようになります。
    -n   スタックからディレクトリを削除するときに通常のディレクトリの変更を抑制し、スタックのみが操作されるようにします。
    +   削除しますリストの左から数えて番目のエントリdirs0 から始まります。たとえば、「popd +0」は最初のディレクトリを削除し、「popd +1」は 2 番目のディレクトリを削除します。

これは当然のことでしょう?

答え1

私は今、popd/pushdを試していますが、これが本来の姿だと思っています。ロジックは、-nディレクトリの変更を抑制することです。もしなしであるべきでした-n

popd +Nゼロ以外の場合、Nディレクトリは変更されません。スタックから要素が削除されるだけです。したがって、この状況で-nは抑制する変更がないため、何もする必要はありません。

逆に、popd -nまたは を使用するpopd -n +0と、スタックの最上部の要素ではなく、スタックの上から 2 番目の要素が削除されます。なぜなら、一番上の要素を削除すると、ディレクトリが変更されるからです。つまり、次のような場合です。

 0  ~/one/two/three
 1  ~/one/two
 2  ~/one
 3  ~

いつ行うかpopd +0、またはpopd行わないか-n

現在のディレクトリは ~/one/two に変更され、 dirs スタックは次のようになります。

 1  ~/one/two
 2  ~/one
 3  ~

したがって-n、この動作を抑制する必要があります。したがって、その代わり実行するpopd -n +0と、popd -nまだ古いディレクトリ内にいて、 dirs スタックは次のようになります。

 0  ~/one/two/three
 1  ~/one
 2  ~

一番上の要素ではなく、上から 2 番目の要素 ~/one/two が削除されたことがわかります (古いディレクトリに残るようにするため)。

ここで強調したいのは、 dirs スタックの最上位が常に現在のディレクトリであるということです。そして、-nディレクトリの変更を防ぐ必要があります。したがって、-nスタックの最上位の変更を防ぐ必要があります。ただし、スタックの最上位が変更されない場合、フラグは-nそのままでは何もしません。

関連情報