`pushd.`と`cd -`の間の衝突

`pushd.`と`cd -`の間の衝突

cd -前のディレクトリに移動するコマンドを使用してうれしいです。同時に私も好きpushd .ですpopd

ただし、現在の作業ディレクトリを覚えてこれを行う場合は、以前のpushd .ディレクトリに移動すると可能性が失われますcd -。 (pushd .また実行cd .)。

pushdまだどのように使用できますか?cd -

注:GNU bash、バージョン4.1.7(1)

答え1

次のように使用できます。

push() { 
    if [ "$1" = . ]; then
        old=$OLDPWD
        current=$PWD
        builtin pushd .
        cd "$old"
        cd "$current"
    else
        builtin pushd "$1"
    fi
}

名前を指定すると、pushd関数は組み込みの前に評価されるため、組み込みよりも優先されます。

上書きすると特別な意味が失われるため、old変数が必要です。currentOLDPWD

答え2

少し簡単なバージョンボイテックの答え:

pushd () {
        if [ "$1" = . ]; then
                cd -
                builtin pushd -
        else    
                builtin pushd "$1"
        fi      
}

関数に名前を付けると、関数名を覚えていなくてもpushd正常に使用できます。pushd

答え3

ケビンの答えはとても良いです。人々が問題を解決するためにスクリプトが必要な理由をよりよく理解したい場合に備えて、何が起こっているのかについていくつかの詳細を作成しました。

CDとディレクトリスタックがどのように機能するかを詳しく調べると、pushd .動作が停止した理由が明らかになります。cd -いくつかのディレクトリをスタックにプッシュしましょう。

$ mkdir dir1 dir2 dir3
$ pushd dir1
~/dir1 ~
$ pushd../dir2
~/dir2 ~/dir1 ~
$ pushd../dir3
~/dir3 ~/dir2 ~/dir1 ~
$ dirs -v
0       ~/dir3
1       ~/dir2
2       ~/dir1
3       ~

cd -これでディレクトリにジャンプしてみることができます。

$ cd -
/home/username/dir2
$ dirs -v
0       ~/dir2
1       ~/dir2
2       ~/dir1
3       ~

cd -以前のディレクトリにジャンプして、スタック〜0をジャンプしたディレクトリに置き換えたことを確認できます。再び戻ることができますcd -

$ cd -
/home/username/dir3
$ dirs -v
0       ~/dir3
1       ~/dir2
2       ~/dir1
3       ~

以前のディレクトリが実際にディレクトリスタックにリストされていなくても、以前のディレクトリに戻ります。これは、以前のディレクトリを追跡するためにcd環境変数が使用されるためです。$OLDPWD

$ echo $OLDPWD
/home/username/dir2 

これにより、pushd .現在のディレクトリの追加コピーがスタックにプッシュされます。

$ pushd . 
~/dir3 ~/dir3 ~/dir2 ~/dir1 ~
$ dirs -v
0       ~/dir3
1       ~/dir3
2       ~/dir2
3       ~/dir1
4       ~

スタック内の現在のディレクトリの追加コピーを作成することに加えて、pushd .以下が更新されました$OLDPWD

$echo $OLDPWD
/home/username/dir3

したがって、cd -有用な履歴が失われ、今は何もせずに現在のディレクトリに移動します。

関連情報