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
変数が必要です。current
OLDPWD
答え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 -
有用な履歴が失われ、今は何もせずに現在のディレクトリに移動します。