Ubuntu Weekly Recipe

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

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

入力ボックス

入力ボックスは,ユーザーが自由に入力できるダイアログを表示します。

$ whiptail --inputbox \
"\n 何について調べますか?\n ────────────────v─────\n                  🐬" \
0 0 "お前を消す方法"

入力した内容は「標準エラー出力」に表示されます。コマンド置換などで結果を取得したい場合は,後述の「メニューボックス」の項目を参照してください。キャンセルボタンを押した場合は,戻り値が1となり標準エラー出力には何も表示されません。

入力ボックスの場合は,高さと幅の数字の後ろに入力ダイアログの「初期値」を指定できます。

図4 おはようからおやすみまであなたを見つめるカイルくん

画像

パスワードボックス

パスワードボックスも入力ボックスと同様にユーザーの入力を受け付けます。パスワードボックスの場合,入力された文字が*でマスクされます。

$ whiptail --title "バズワードのセットアップ" \
--passwordbox "\nカタカナと英数字を利用し、技術的な用語と一般的な用語を組み合わせることで、\
それっぽいバズワードになります。\n\n新しいバズワード:\n" 13 70

当たり前のことではありますが,マスクされるのは表示部分だけです。入力した文字列は,入力ボックスと同様に標準エラー出力にマスクされずに表示されます。

ちなみに入力ボックスと同様に初期値を指定できます。ただしマスクされているため,ユーザーは初期値が何であるかはわかりません。さらにシェルコマンドとして記述する都合上,初期値はマスクされずにスクリプトやコマンド履歴に残ることになります。よってパスワードボックスで初期値を使うことはまずないでしょう。

図5 毎年新たなバズワードが生まれては消えていく

画像

テキストボックス

テキストボックスは任意のファイルの内容を表示するダイアログです。ファイル名を指定すれば,それを表示します。またファイル名に/dev/stdinを指定すれば,ヒアドキュメント経由でコマンドの結果を渡せます。

$ whiptail --textbox /dev/stdin 0 0 \
<<<"$(curl http://changelogs.ubuntu.com/changelogs/pool/main/n/newt/newt_0.52.18-1ubuntu2/changelog)"

ボックスの幅と高さを指定した場合は,その領域に入るサイズでしかファイルを表示しません。幅と高さを指定しなかった場合は,ボックスのサイズをあふれる時に,カーソルキーやPageUp/PageDownキーでスクロールできます。幅と高さを指定しつつスクロールしたい場合は「--scrolltext」オプションを使用してください。

図6 ダブルクオーテーションでくくれば改行も表示される

画像

メニューボックス

メニューボックスはその名のとおり,選択式のメニューを表示するダイアログです。ボックスの高さと幅の後ろに,メニュー領域の高さを指定した上で,⁠タグ 項目」の文字列をメニューの数だけ繰り返してしていきます。

選択肢を選んだ上でEnterキーを押すか,OKボタンを押すと標準エラー出力に「タグ」の方が出力されます。Cancelボタンを押すと戻り値が1となり,標準エラー出力には何も表示されません。

シェルスクリプト内部でwhiptailを使う場合,その選択結果をコマンド置換を用いて変数に代入したいことがあるでしょう。単純に標準エラー出力を標準出力にリダイレクトする方法だと,whiptailのUIまで変数に入ってしまいます。そこで以下のコマンド3>&1 1>&2 2>&3では,標準出力と標準エラー出力を入れ替えています。

$ choise=$(whiptail --title "選ばれたのは" --menu "選ばれたのは?" 0 0 0 \
"綾鷹" "コカ・コーラ" "伊右衛門" "サントリー" "お〜いお茶" "伊藤園" "生茶" "キリンビバレッジ" \
3>&1 1>&2 2>&3) && echo "選ばれたのは「${choise}」でした。"

この方法は,入力ボックスやパスワードボックス,チェックリスト,ラジオボタンなどでも使用できます。なお「--output-fd」オプションを使えば,出力先のファイルディスクリプタを直接指定できます。

上記コマンドでは高さと幅だけでなく,メニューの高さも0に設定しているため,メニューが収まる適切なサイズのボックスが作成されます。

「--notags」を使うと,タグを非表示にできます。どれを選んでも結果的に「綾鷹」にしたい場合に便利です。

$ choise=$(whiptail --notags --title "選ばれたのは" --menu "選ばれたのは?" 0 0 0 \
"綾鷹" "綾鷹" "綾鷹" "伊右衛門" "綾鷹" "お〜いお茶" "綾鷹" "生茶" \
3>&1 1>&2 2>&3) && echo "選ばれたのは「${choise}」でした。"

図7 ⁠選ばれたのは綾鷹でした。」

画像

著者プロフィール

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

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