シェル(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を付ける必要がある。