まだ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で捗りましょう。

Follow me!

Leave a Reply