シェル(rc)スクリプトを書くときのTips
今日の元ネタは、「シェル(bash)スクリプトを書くときのTips 」。
`{command}
コマンド置換。コマンドを実行し、その標準出力を引数として読み込むには、`{...}を使う。もちろん入れ子もOK。
ん、Plan9にはbasename(1)はあるけど、dirname(1)はないのね。
<{command}、>{command}
bashにはないけど、zshだとプロセス置換と呼ぶのかな? コマンドの出力をファイルのように扱うことができる。
>{...}もOK。内部的にはコマンドの標準入出力をパイプにつなげるんだけど、次の例のように、非線形なパイプラインを作ることができる。
cpu% diff <{echo hoge} <{echo boke} 1c1 < hoge --- > boke
diff(1)以外だとjoin(1)とかも便利かな。
数値演算
rcに(())相当の機能はない。exprの代わりにhoc(1)を使う。hocは小数点演算もOK。また演算子の間にスペースを入れるのはNG。
cpu% echo `{hoc -e 1.1+2.2} 3.3
ちなみに、
while () {...}
は無限ループ。
read
rcにはread内部コマンドはないので、read(1)で代替する。似たようなネタを「10のPlan9小技」で書いていたけど、Plan9にはfindやxargsは存在しない。こんな感じかな?
cpu% du -a |awk '{print $2}' | while (f=`{read}) { echo $f }
UNIXでrc -- おわりにかえて
UNIXでもrcが使いたいという場合、Plan9portがおすすめだけど、rc shell FAQを眺めていたUNIXへの移植版もあるようだ。オリジナルのrcを書いたのはTom Duffさんだけど、Byron RakitzisさんがUNIXに移植している。でも、肝心のブツが404エラーだよと思っていたら、WebArchive.orgからサルベージしている人がいた。すばらしい。MacOS X 10.4での動作も確認。
GNU readlineが使えるとよろこんでんだけど、MacOS Xだとlinkに失敗した。前提としているライブラリが古すぎるのかな?でも、代わりに組み込みのeditlineってのが使えるから、それで十分かも。configure時に--with-editlineを付ける必要がある。