GUIプログラミング
操作性に優れた簡易的なGUIをbashにて使用したいというユーザの場合、BashDiffにより追加されるgtkコマンドを試してみるべきだろう。その起動構文はgtk gtk.xmlという非常にシンプルなもので、ここで使うXMLはリダイレクトさせることもできる。この機能については、bashでのXMLの使用によるGUIの構築という点に難色を示すユーザがいるかもしれないが、ここで用いるXMLスキーマは極めて単純なものだ。GUIを構成するオプションやボタンの類は、bashのシェルスクリプトにて作成でき、これらを実行すれば必要なXMLエレメントが出力されるようになっている。そして、ユーザによるボタンクリックで実行させるbashコマンドの設定といった、GUIとの情報交換は、commandなどの特殊なXML属性を介して行えばいい。同様に、コンボボックスやテキストフィールドにてユーザが行った設定内容については、id属性にて指定したシェル変数にGUI終了時点で格納するという方式になっている。
なお今回のテスト中、gtkコマンドによるsegfaultが何度か発生したが、後半部のテストでは、この問題はそれほど再発しなかった。
下記のサンプルXMLは、簡単なテキスト入力フィールドを備えたGUIを作成するためのもので、ここではOKボタンのクリックで、ユーザの入力値を$entryというシェル変数に格納させるようにしている。
$ cat gtk2.xml
<dialog border="10" buttons="gtk-ok,gtk-cancel" id="dialog">
<entry id="entry" initial="initial text"/>
</dialog>
$ gtk gtk2.xml
$ echo $entry
this is the text
その他の機能
BashDiffの適用によるめぼしい機能拡張はこうしたものだが、その他にもこのパッチは、雑多な構文および機能的な追加をbashに施すことになる。例えば、インプット時のインデントを保持させたい場合に役立つのが<<+によるヒアドキュメント機能だ。
同じくvplotコマンドは、1つまたは2つのbash配列からデータを取得して、ターミナル上でX-Yプロットを行うという機能を有している。この入力データについては配列名を指定する他に、コマンドライン上でx1 y1 x2 y2といった形式での座標データを直接入力することもできる。
BashDiffパッチの適用ではRPN式の計算機も追加され、PHPと同様の方式にて、1つのファイル上でテキストとbashコマンドを混在させることも可能となる。
その他には、標準入力経由で受け取るカード読取装置の生データからの情報抽出および、クレジットカード番号用の操作を行うcardswipeとcreditcardのように、実際の用途はかなり限られているであろうコマンドも追加される。仮にこれらのコマンドを実用に供する場合は、特定メーカ製のPOS用ハードウェアに対応したprotobaseコマンドも併用することになるだろう。
BashDiffでは、文字の種類などを検証するctype.hの機能も多数取り込まれるようになっている。ただし残念ながら今回の試験では、これらの機能を正常に処理させることはできなかった。つまり下記のサンプルのようにisnumberをそのまま実行すると、判定可能な文字種の指定パターンが一覧されるのだが、その1つを用いて、大文字のGに対するisnumber upper Gという判定を行わせると、本来は正しいと評価されるべきなのに“invalid number”とされてしまうのだ。
$ isnumber
isnumber: usage: isnumber { alnum | alpha | ascii | blank ...
| cntrl | digit | graph | lower | print | punct | space ...
| upper | xdigit | letter | word } number...
$ isnumber upper G
bash+william: isnumber: G: invalid number
以上、BashDiffというパッチについて長々と紹介したが、実際にこれらの機能がノーマル状態のbashシェルを置き換えるだけの価値を有すかは、かなり微妙な判断となるだろう。確かにBashDiffを適用すれば、caseコマンドなどでの不一致処理といった、スクリプティング作業を簡単化してくれる多数の機能が利用可能となるのは間違いないのだが、仮にこうしたオプションが使えないとしても、ノーマル状態のbash固有の機能だけで同等のスクリプトを組むのは、多少手間はかかるものの決して不可能ではないのだ。とは言うものの、ログインシェルとしてのbashに適用するかは別問題として、リレーショナルデータベースや大規模なルックアップテーブル(gdbm)を扱うユーザであれば、これらの操作機能をBashDiffを介して導入しておいても損はないのではなかろうか。
Ben Martinは10年以上にわたってファイルシステムに取り組んでおり、博士課程の修了後、現在はlibferris、ファイルシステム、検索ソリューションを中心としたコンサルティング業に従事している。
