早速bash4.0の新機能をレビューしてみた

bash4が出た。bash4とzshの違いが気になっていた自分としてはいてもたってもいられずコンパイル&実験してみた。

取得、コンパイル、インストール

簡単だった。

wget http://ftp.gnu.org/gnu/bash/bash-4.0.tar.gz
tar xzf bash-4.0.tar.gz
cd bash-4.0
./configure
make
sudo make install

サブディレクトリを再帰的にファイル検索するglobstar

shopt -s globstarすると再帰的にマッチする*である ** が使えるようになる。

$ mkdir -p a/b a/c/d a/e/f a/e/g ; touch a/A a/b/B a/c/C a/c/d/D a/e/E a/e/f/F a/e/g/G
$ for i in a/** ; do echo $i ; done
a/A
a/b
a/c
a/e
$ shopt -s globstar
$ for i in a/** ; do echo $i ; done
a/
a/A
a/b
a/b/B
a/c
a/c/C
a/c/d
a/c/d/D
a/e
a/e/E
a/e/f
a/e/f/F
a/e/g
a/e/g/G

testコマンドと組み合わせるとfindが不要になるとおもわれる?

$ for i in a/** ; do if [ -f $i ]; then echo $i ;fi ; done
a/A
a/b/B
a/c/C
a/c/d/D
a/e/E
a/e/f/F
a/e/g/G

fi;doneが冗長に見えるがfindも-execでは \{} \; が必要だもんな。

追記 2009/02/25 23:50:26:

以下の2つの表記でもOK

$ for i in a/** ; do [ -f $i ] && echo $i; done
$ for i in a/** ; { [ -f $i ] && echo $i; }
追記 ここまで

再帰的grepもお手のもの

$ grep aaa **

ディレクトリ名を入力するだけでカレントディレクトリを変更できるautocd

これをセットするとディレクトリ名でcdできるようになる。

$ a
bash: a: command not found
$ shopt -s autocd
$ a
cd a

入力補完時にディレクトリ名のスペルミスを修正するdirspell

補完時にスペルミスを修正するとあるがうまく使えない。

$ mkdir abcde
$ shopt -s dirspell
$ cd abf

ここで補完してくれると思ったんだけどなぁ

$ cd /usr/locl/bin<tab>

これはきちんと修正するんだけどなぁ。

$ cd /usr/local/bin/

caseのフォールスルーを実現する &; ;;&

まあ、使ってみればわかるが case中で ;; -> ;&にするとフォールスルーが実現できる。

$ case a in a) echo a;; b) echo b;; esac
a
$ case a in a) echo a;& b) echo b;; esac
a
b
$ case b in a) echo a;& b) echo b;; esac
b
$ case a in a) echo 1;;& a) echo 2;; a)echo 3 ;; esac
1
2
$ case a in a) echo 1;;& b) echo 2;; a)echo 3 ;; esac
1
3
$ case a in a) echo 1;& b) echo 2;; a)echo 3 ;; esac
1
2

まあ、滅多に使わないか

標準エラーを標準出力にマージしながらアペンドする &>>

まあ今までだと

$ echo "1">a;ruby -e 'STDOUT.puts("stdout");STDERR.puts("stderr")' >> a 2>&1
$ cat a
1
stderr
stdout

これじゃないと標準出力をマージしつつアペンド出来なかったのが

$  rm a; echo "1">a;ruby -e 'STDOUT.puts("stdout");STDERR.puts("stderr")' &>> a
$ cat a
1
stderr
stdout

これで出来るようになったと アペンドじゃないときには &> が使えてたからまあ問題なしだな。

感想

先行予測補完をのぞけば大体zshに近づいたのではないかと。

まあ、あと何点かあるけど気にしない。先日拡張したfcコマンドがあるしw > bashのfcコマンドを整形後にエディタで編集する - 計算機と戯れる日々

履歴のマージ等は「bashをzshに負けないぐらい高機能化するためのtips - 計算機と戯れる日々」をやれば今時のマシンパワーなら全く問題なし。

はやくubuntuに導入されないかな。