みなさん、こんにちは。第3回の講座です。

今回は簡単なマクロを書いてみましょう。今まで例として fileinfoコマンドを使ってきましたが、fi で済ましている人って多くないですか?fi は HPE が提供する標準マクロではありません。fi を使うということは、誰かが作った fi マクロを知らず知らずのうちに使っているのです。

同じような例は……

v ⇒ volume
f ⇒ files
fs ⇒ fup subvols

などをよく見ます。では fi の代わりに ls で fileinfo できるようにしてみましょう。

第1回で、「macro や routine などはファイルであったり variable であったりします。」と書きました。ファイルか variable か、それはそれぞれ使い勝手というものがありますからケースバイケースで判断すればいいのですが、話の順番として、最初はファイル形式で実装してみます。次のような2行だけのファイルを用意してください。

それに ls という名前を付けてどこかの subvol に置きましょう。

そして実行です。

どうでしょうか。($data01.case1 の部分はみなさんの環境に合わせて適当に指定してください。)この結果と fileinfo の結果を比べてみましょう。

どうですか?同じ結果になると思います。もうひとつやりましょう。

これも fileinfo と比較します。

同じ結果にはなりませんね。ファイル名の部分が2つになりましたが、 lsでは2つ目の $data01.case2.* の部分が表示されません。

さきほどの %1% という部分がパラメータの指定で、「第一パラメータを処理しなさい」という意味になります。%2% と書いてないので、第二パラメータの $data01.case2.* は処理されなかったわけですね。ならばパラメータが増えるかもしれない分 %3% %4% と書かないといけない……

パラメータ数の最大値が分かるならそれもありですが、ls では最大値は固定できません。そこでこうします。

これで「すべてのパラメータを処理しろ」という意味になります。なので、パラメータがいくつになってもちゃんと処理してくれます。これがうまくいくのは、勿論 #xfileinfo が複数パラメータに対応しているからです。

一行目が ?tacl macro なので、この ls は macro です。これが ?tacl routine なら ls は routine になります。ただ、%1% とか %*% は macroでしか使えないので

と書いて実行してもエラーになります。routine の場合の書き方は後日説明します。

ここで、「fileinfo は alias なんだから、ls も alias にするのがよいのでは?」と思った方はいませんか?

その通り、あなたは鋭い。世間に転がっている fi マクロは macro 形式で実装されているのをよく見ます。パラメータのハンドリングを変えたいならともかく、単に読み替えているだけなら alias 形式で実装するのが筋というものです。ここでは解説しませんが、実際 alias でないといけない理由もあるので、macro 形式は正しい設計ではないと言えます。

しかし、ファイル形式のマクロは alias が使えません。macro か routineのみファイル形式で扱えます。そこでここでは仕方なく macro 形式で実装しています。また、「run $vol.subvol.ls って、面倒くさい、単に ls では駄目なの?」と思ったあなた、それは正しい。正しくて鋭いあなたのために、その点を次回に variable 形式で解決しましょう。

なお、システム subvol にファイルを置くことで、ファイル形式でも ls だけで使えるようにする方法もあります。これについてはいつか触れることがあるかもしれません。

では次回 variable 形式でお会いしましょう。Au revoir!