まだcdで消耗してるの? – オレオレアドベントカレンダー21日目
なんか、使えるワンライナーとかいう記事見つけて
「cd -」を何故使わないのか?とかいうマウントとったかのような書き方をされたんですが、いやそれ普通だし。
linux の cdはshell組み込みコマンドだった
cd – は、bashの組み込みコマンドの方のcdの機能ですね。実際にはシェル変数OLDPWDに移動前の絶対パスが残っていて、cd – と打つとOLDPWDの場所に移動するという仕組みです。なお、CentOS(多分RHELも)だと、/usr/bin/cdはただのshell scriptで、こう書いてあります。
#!/bin/sh
builtin cd "$@"
ubuntuに至っては、いさぎよくcdコマンドが/binにありません。ビックリですね。ということは、dashもそうなのかー、と思ったらそうでした。2度ビックリ。
イケてるエンジニアはディレクトリスタック
さて、イケてるエンジニアはディレクトリをスタックとして扱うのです。
そう、 pushd/popd/dirs を使うのです。
$ pwd
/home/s-miyaza
$ pushd /tmp
/tmp ~
$ pushd /usr/local
/usr/local /tmp ~
$ pushd
/tmp /usr/local ~
おわかりいただけただろうか。
pushd ディレクトリ名で、かつてのPWDと指定したディレクトリをスタックに乗せられ、なおかつ複数スタック可能。しかもpushd でディレクトリスタック間を移動可能。defaultは次のスタック(1)で、引数で+2と指定すると、指定した数のスタックにpush出来る。
$ pushd
/usr/local /tmp ~
$ pushd +2
~ /usr/local /tmp
ディレクトリスタックいうくらいスタックなので、pushだけでなくpopd でpopできます。defaultで+2 で指定した数のスタックをpopできる。
$ popd
/usr/local /tmp
$ pushd ~
~ /usr/local /tmp
$ popd +2
~ /usr/local
現在のディレクトリスタックはdirsコマンドで見ることが出来る。dirs -vで縦型に表示するので、スタック感が増すぞ!
$ pushd /tmp
/tmp ~ /usr/local
$ dirs
/tmp ~ /usr/local
$ dirs -v
0 /tmp
1 ~
2 /usr/local
pushd/popdイケてない所
とはいえ、pushd/popdにもイケてない部分はある。同じディレクトリもスタックに溜められるのだ。
$ pushd /tmp/
/tmp /tmp ~ /usr/local
$ pushd /tmp/
/tmp /tmp /tmp ~ /usr/local
$ pushd /tmp/
/tmp /tmp /tmp /tmp ~ /usr/local
$ pushd /tmp/
/tmp /tmp /tmp /tmp /tmp ~ /usr/local
$ pushd /tmp/
/tmp /tmp /tmp /tmp /tmp /tmp ~ /usr/local
$ pushd /tmp/
/tmp /tmp /tmp /tmp /tmp /tmp /tmp ~ /usr/local
$ dirs -v
0 /tmp
1 /tmp
2 /tmp
3 /tmp
4 /tmp
5 /tmp
6 /tmp
7 ~
8 /usr/local
真にイケてるのはzshのcdだった
まあイケてるエンジニアはshellを選ばないものですが、zshは最強のシェルなので、 setopt AUTO_PUSHD を設定すると 、cd でpushd/popd相当のことが出来るのです。しかも setopt PUSHD_IGNORE_DUPS を設定すると、ディレクトリスタックの重複したパスを無視してくれるのです。
% setopt AUTO_Pushd
% setopt Pushdignoredups
% cd /tmp
% cd ~
% dirs -v
0 ~
1 /tmp
% cd /usr/local
% cd ~
% dirs -v
0 ~
1 /usr/local
2 /tmp
% cd ~
% dirs -v
0 ~
1 /usr/local
2 /tmp
% cd /tmp
% cd /tmp
% cd /tmp
% cd /tmp
% dirs -v
0 /tmp
1 ~
2 /usr/local
結論として、zshで万全
zfsで万全なように、zshで万全なのです。コンプリート機能も強力ですし、zpoolとかzfsとかsvcadmとかipadm とかのSolaris系コマンドはzshコンプリートが充実しているので、Solaris使いの人もそうでない人もzshで捗りましょう。