pushd/popdが使える人は賢いのだろうけど

cd -は、一つ前のディレクトリのみが記憶されていますが、
複数ディレクトリを記憶しておきたい場合は、pushd/popdというコマンドがあります。

pushd ディレクトリ
は、カレントディレクトリをスタックへ退避して、指定されたディレクトリへ切り替えます。

popd
は、スタックからディレクトリを復帰して、カレントディレクトリとします。

さらに、
dirs
は、現在のスタックを表示します。

以下のようなディレクトリでpushdとpopd、dirsを使って確認したいと思います。

~/tmp$ tree
.
├── aaaa
│   └── bbbb
│       └── cccc
└── dddd
    └── eeee
        └── ffff
            ├── gggg
            └── hhhh

8 directories, 0 files
~/tmp$ 

まずは、dirsで、ディレクトリスタックを確認してみます。
その後pushdで、カレントディレクトリをhhhh、dddd、ccccへと切り替えし、再度dirsを確認します。
ディレクトリ表示だらけで、見づらくなるのでプロンプトを最初に変更しています。

~/tmp$ PS1="\n[CURRENT DIRECTORY = \w]\n$ "

[CURRENT DIRECTORY = ~/tmp]
$ dirs
~/tmp

[CURRENT DIRECTORY = ~/tmp]
$ pushd dddd/eeee/ffff/gggg
~/tmp/dddd/eeee/ffff/gggg ~/tmp

[CURRENT DIRECTORY = ~/tmp/dddd/eeee/ffff/gggg]
$ pushd ~/tmp/dddd
~/tmp/dddd ~/tmp/dddd/eeee/ffff/gggg ~/tmp

[CURRENT DIRECTORY = ~/tmp/dddd]
$ pushd ~/tmp/aaaa/bbbb/cccc
~/tmp/aaaa/bbbb/cccc ~/tmp/dddd ~/tmp/dddd/eeee/ffff/gggg ~/tmp

[CURRENT DIRECTORY = ~/tmp/aaaa/bbbb/cccc]
$ dirs
~/tmp/aaaa/bbbb/cccc ~/tmp/dddd ~/tmp/dddd/eeee/ffff/gggg ~/tmp

[CURRENT DIRECTORY = ~/tmp/aaaa/bbbb/cccc]
$ 

ディレクトリが多すぎて何がなんだかわかりません。
せっかくテキスト整形の技があるので、dirsの表示も変えてしまいましょう。

[CURRENT DIRECTORY = ~/tmp/aaaa/bbbb/cccc]
$ dirs | tr ' ' '\n' | nl
     1	~/tmp/aaaa/bbbb/cccc
     2	~/tmp/dddd
     3	~/tmp/dddd/eeee/ffff/hhhh
     4	~/tmp

[CURRENT DIRECTORY = ~/tmp/aaaa/bbbb/cccc]
$ 

なかなか良い具合になりました。この形の表示が毎回コマンドプロンプトと一緒に表示されてたら嬉しいです。
PROMPT_COMMANDという環境変数を使うと、bashのプロンプトが表示される前に登録したコマンドを実行してくれます。
ついでにPS1は単純に”$ “にしておきましょう。

[CURRENT DIRECTORY = ~/tmp/aaaa/bbbb/cccc]
$ PS1="$ "
$ PROMPT_COMMAND='echo "========================================"
dirs | tr " " "\n" | nl'
========================================
     1	~/tmp/aaaa/bbbb/cccc
     2	~/tmp/dddd
     3	~/tmp/dddd/eeee/ffff/hhhh
     4	~/tmp
$ 

これで、プロンプト表示の度に、ディレクトリスタックの内容がわかるわけです。
popdを使っていきます。

========================================
     1	~/tmp/aaaa/bbbb/cccc
     2	~/tmp/dddd
     3	~/tmp/dddd/eeee/ffff/hhhh
     4	~/tmp
$ popd
~/tmp/dddd ~/tmp/dddd/eeee/ffff/hhhh ~/tmp
========================================
     1	~/tmp/dddd
     2	~/tmp/dddd/eeee/ffff/hhhh
     3	~/tmp
$ popd
~/tmp/dddd/eeee/ffff/hhhh ~/tmp
========================================
     1	~/tmp/dddd/eeee/ffff/hhhh
     2	~/tmp
$ popd
~/tmp
========================================
     1	~/tmp
$ 

最終的に元のディレクトリまで戻ってきました。

ここまでやっておいてなんですが、私はpushd/popdはほとんど使いません。
cdと比べてコマンドの文字数が長いことと(cdは2文字、pushdは5文字)
pushdを多用したときに、ディレクトリスタックが覚えきれないからです。

コメント

タイトルとURLをコピーしました