Ubuntu Weekly Recipe

第422回 whiptailでCUIをグラフィカルにする

この記事を読むのに必要な時間:およそ 4.5 分

CUIでシェルスクリプトや設定コマンドを書いていると,自分以外の誰かが使う可能性を考えて,よりユーザーフレンドリーなインターフェースにしたいケースが稀にあります。今回はそんなケースで使える,⁠whiptail」を紹介します。

whiptailとは?

whiptailはnewtと呼ばれるテキストモード(CUI)用のウィンドウツールキットに同梱されているプログラムです※1)⁠具体的にはDebianパッケージの設定システムであるdebconfや,Xが動いていない環境でim-configが設定ダイアログを表示するときに使用しています。

※1
whiptailは「鞭のような尻尾」という意味ですが,トカゲの一種の総称としても使われます。それに対してnewtはイモリのことを示します。ちなみにトカゲは戸の影に隠れている爬虫類です。イモリは井戸の中を守ってくれている両生類です。
newtのパッケージには「Not Erik's Windowing Toolkit」という説明があります。おそらく以前はこの頭字語だったのでしょうが,今のnewtのサイトにはその説明はありません。ちなみにnewtのオリジナルの作者は,RPMの作者の一人でもあるErik Troanです。

このwhiptailをシェルスクリプトと組み合わせて使うと,CUI上でも簡単に問い合わせダイアログや選択用のチェックボックス,進捗バーの表示を作れることができるのです。しかも,whiptailパッケージはdebconfが依存している都合上,どのようなUbuntuマシンでも最初からインストールされています。よって環境依存性をあまり考慮しなくても使えるというメリットも存在します。

図1 ⁠どっちだよ!」とツッコミたくなるダイアログも簡単に作れる

画像

whiptailの使い方

whiptailはただのコマンドです。whiptailコマンドを実行したら,戻り値や標準出力・標準エラー出力に表示される値を元に次の処理を行うようにシェルスクリプトを書くだけです。シェルスクリプトを書いたことがある人であれば,あとはmanページを読めば,やりたいことを実現できるでしょう。

そこでこのRecipeでは「どんなことができるの?」という観点で,すべての機能をスクリーンショット付きでお届けします。

whiptailの基本的な書式

whiptailの基本的な書式は以下のとおりです。

$ whiptail レイアウトオプション ボックスオプション

レイアウトオプションにはボックスタイトルやボックスの位置といった,ボックス共通のレイアウトに関するオプションを設定します。たとえば「--backtitle」は画面左上に文字列を表示し,⁠--topleft」はダイアログを画面中央ではなく左上隅に表示します。

ボックスオプションにはボックスの種類や種類ごとのオプションについて設定します。たとえばチェックボックスなら選択肢の一覧を指定しますし,入力ボックスなら初期値を設定します。

ちなみにlibnewtはgettextによる翻訳をサポートしています。その都合上,⁠Ok/Cancel/Yes/No」は日本語ロケールならすべて「了解/取消/はい/いいえ」と翻訳されます。今回の記事でOKボタンやYesボタンと言及していても,ボタンのラベルはロケールによって異なることがあるので注意してください。

Yes/Noダイアログ

Yes/Noダイアログはその名のとおり,Yes/Noボタンを表示するダイアログです。

$ whiptail --yesno 説明 ダイアログの高さ ダイアログの幅

高さと幅は数値で指定します。説明に指定した文字列が幅を超えると自動的に改行します。両方とも0にすると,適切な高さと幅を自動的に設定します。

たとえば次のコマンドは,図1のキャンセルダイアログを表示するコマンドです。

$ whiptail --title "キャンセルしますか?" --no-button "キャンセル" --yesno "本当にキャンセルしますか?" 8 50

「--title」はダイアログのタイトルになります。⁠--no-button」はNoボタンのラベルを変更するオプションです。⁠--yes-button」オプションを使えば「はい」も変更できますし,⁠--cance-button」「--ok-button」オプションも存在します。

メッセージボックス

メッセージボックスは,メッセージとOKボタンのみを表示するダイアログです。ユーザーに何か情報を通知し,ユーザーがそれを確認するまで待つ場合に使用します。

$ whiptail --ok-button "はい" --msgbox "もし わしの みかたになれば\nせかいの はんぶんを\nおまえ に やろう。" 10 25

上記のように文字列の中に\nによって改行文字を入れることも可能です。ただしANSIエスケープコードなどは埋め込めません。

図2 ⁠どうじゃ? わしの みかたに なるか?」

画像

インフォボックス

インフォボックスはメッセージボックスと似ていますが,ユーザーの操作を待たずに即座に終了します。表示されたメッセージは画面に残るので,ノンインタラクティブなシェルスクリプトで通知だけ残したい場合に便利です。

ただしxtermやGNOME端末では問答無用でメッセージがクリアされるため,そのままでは使えません。もしこれらの端末ソフトウェア上で使用したい場合は,次のように環境変数TERMにxterm系以外を設定しましょう。

$ TERM=vt100 whiptail --title "たかしへ" --infobox "おやつはVT100の中にあります。" 7 45

図3 VT100を冷蔵庫代わりに使うかーちゃん

画像

著者プロフィール

柴田充也(しばたみつや)

Ubuntu Japanese Team Member株式会社 創夢所属。数年前にLaunchpad上でStellariumの翻訳をしたことがきっかけで,Ubuntuの翻訳にも関わるようになりました。

コメント

コメントの記入