UbuntuやCentOSに入ってるwhiptailでTUIっぽいスクリプトを作成する(+注意点とか)

個人的に、数字を入力してリストから選択するとかがあまり好きではなく、コンソール上でもカーソルキーとかで選択したりしたいタイプなのだが、実はUbuntuやCentOSの場合ならインストール時にwhiptailというコマンドがバンドルされている。 これ、なんのコマンドなのかというとOSインストール時とかに表示される疑似GUIみたいなTUIを扱えるようにするコマンドで、まあ↓のようなやつ。多分一回は見たことあると思う。

で、このコマンドでは色々な種類のレイアウト(リストからの選択や入力など)をオプションで指定ができる。 ncursesとか使って別途プログラムを書くという方法もあるけど、そこまでしたくない処理であれば、これを使ってお手軽TUIなスクリプトを作ることが可能。 以下のようにオプション等を指定して実行する。ボックスオプションで指定する<height>は行、<width>は文字単位で指定する。

whiptail <option> --ボックスオプション ~

1. 使えるボックスオプション

whiptailで使えるボックスオプションは結構多く、以下のような種類がある。

  • --msgbox <text> <height> <width> : メッセージボックスを表示してくれる。
  • --yesno <text> <height> <width> : はいorいいえで回答するボックスを表示してくれる。選択結果はexit codeで返してくれる。
  • --infobox <text> <height> <width> : infomationボックスを表示してくれる。※xtermだと動作しないので注意
  • --inputbox <text> <height> <width> [デフォルト値] : 任意の文字列を入力できるボックス。デフォルトの入力値を指定できる。
  • --passwordbox <text> <height> <width> [デフォルト値] : パスワード入力ボックス。デフォルトの入力値を指定できる(使うのか?)。
  • --textbox <file> <height> <width> : 指定したテキストファイルの内容を表示するボックス。
  • --menu <text> <height> <width> <listheight> [tag item] ... : 指定したリスト(配列)から選択をするボックスを表示させる。返り値としてはtagが返ってくる。
  • --checklist <text> <height> <width> <listheight> [tag item status]... : 指定したリスト(配列)から複数選択が可能なチェックリストを表示させる。返り値はtagが返ってくる。
  • --radiolist <text> <height> <width> <listheight> [tag item status]... : 指定したリスト(配列)から一つを選択するボックスを表示させる。返り値はtagが返ってくる。
  • --gauge <text> <height> <width> <percent> : パイプで渡すことで、進行状態を出力するボックスを表示してくれる。

念のため、それぞれのボックスの実行コマンドを残しておく。

# msgbox
whiptail --msgbox test 10 35

# yesno
whiptail --yesno test 10 35

# infobox
TERM=vt100 whiptail --infobox test 10 35 #xtermだと表示できないので、とりあえず標準出力させる

# inputbox
whiptail --inputbox test 10 35
whiptail --inputbox test 10 35 test_str #デフォルト値有りの場合

# passwordbox
whiptail --passwordbox test 10 35
whiptail --passwordbox test 10 35 test_str #デフォルト値有りの場合

# textbox
whiptail --textbox PATH 10 35

# menu
whiptail --menu test 12 35 4 \
1 aaa \
2 bbb \
3 ccc

# checklist(タグ 説明 フラグ)
whiptail --checklist test 12 35 4 \
1 aaa ON \
2 bbb OFF \
3 ccc OFF

# radiolist(タグ 説明 フラグ)
whiptail --radiolist test 12 35 4 \
1 aaa ON \
2 bbb OFF \
3 ccc OFF

# gauge
seq -f'echo %g;sleep 0.1' 100 | bash | \
whiptail --gauge test 12 35 0

2.その他のオプション(表示とか)

whiptailでは、オプションを付与することで表示を調整したりすることができる。

  • --clear : whiptail終了時に画面をclearする(xtermでは機能しないのであまり使わない)
  • --defaultno : カーソルのデフォルト位置をNoにする(yes/no)
  • --default-item <string> : カーソルのデフォルト位置を指定した文字列のアイテムにする
  • --fb, --fullbuttons : ボタン表示を立体的なものにする
  • --nocancel : キャンセルボタンを非表示にする
  • --yes-button <text> : yesボタンのテキストを置き換える
  • --no-button <text> : noボタンのテキストを置き換える
  • --ok-button <text> : okボタンのテキストを置き換える
  • --cancel-button <text> : キャンセルボタンのテキストを置き換える
  • --noitem : アイテムを表示させない(menu等)
  • --notags : タグを表示させない(menu等)
  • --separate-output : checklistボックス実行時に、結果をセパレート無しで出力をする
  • --output-fd <fd> : 指定したファイルディスクリプタに出力する
  • --title <title> : ボックスにタイトルを表示する
  • --backtitle <backtitle> : バックグラウンドにタイトルを表示する
  • --scrolltext : 表示するテキストをスクロールできるようにする
  • --topleft : ボックスを左上に表示させる

ちなみに、色などについては環境変数「NEWT_COLORS」で指定するようだ。 「name=fg,bg」(nameは指定するオブジェクト名)の形式で指定する(rootがバックグラウンド)。

export NEWT_COLORS='
root=white,green
window=white,red
border=white,red
textbox=white,red
button=black,white
' \
whiptail --menu test 12 35 4 \
aaa ON \
bbb OFF \
ccc OFF

…目がチカチカする(´・ω・`)。

シェルスクリプトなどで利用する際の注意点

取得した値の変数への代入

取得した値を変数に代入して使用する場合、以下のようにファイルディスクリプタの入れ替えをしておく必要がある。

VAR=$(whiptail --inputbox "<text>" <height> <width> 3>&1 1>&2 2>&3)

[root@BS-PUB-CENT7-01 ~]# AAA=$(whiptail --inputbox "$(echo ウホ{?,,?,,,})" 10 30 3>&1 1>&2 2>&3)
[root@BS-PUB-CENT7-01 ~]# echo $AAA
うっほほい

わざわざ強調して言うことでもないけど、menuで表示させるリストを変数で指定する場合はただ複数行にするのではなく、ちゃんと配列にしないといけないので注意。

blacknon@BS-PUB-UBUNTU-01:~$ echo {01..05}\ ABC | xargs -n2
01 ABC
02 ABC
03 ABC
04 ABC
05 ABC
blacknon@BS-PUB-UBUNTU-01:~$ AAA=($(echo {01..05}\ ABC | xargs -n2))
blacknon@BS-PUB-UBUNTU-01:~$ whiptail --menu test 12 35 5 ${AAA[@]}


参考