カビパン男と私

HOME/横書き縦書き

whiptail で遊んだ

whiptail は制御コードをいっぱい使ってターミナルにきれいなダイアログを出し、ユーザー入力を促すプログラムだ。なにを今さらと感じるかもしれないが、X が使えないところでも使えるのがうれしい。

ちょっと遊んでみて気づいたことは、whiptail はダイアログを標準出力に、ユーザー入力を標準エラーに出すということだ。なんか逆のほうが使いやすそうだけど、そうなってる。となると、ユーザー入力を変数に入れるとか、パイプに通すとかしたいなら、標準エラーをリダイレクトしなきゃいけない。でもたんに標準エラーを標準出力にリダイレクトすると、ダイアログ表示のための出力と混ざり合ってしまう。

そうなると、標準入力と標準エラーを取り替えるのが手っ取り早い。そこで登場するのは 3>&1 1>&2 2>&3 ていう例の呪文だ。

name=$(whiptail --inputbox "氏名" 10 30 "John Smith" 3>&1 1>&2 2>&3)

みたいな感じでやればよい。

でもこれ、あらかじめ exec 3>&1 1>&2 2>&3 とかやっておいたシェルで whiptail を起動するという作戦では駄目で、パイプする直前でやるとか $() の中でやるとかしないと利かない。

ちょっとそれについてメモしておこうとして、はたと手が止まった。自分は標準出力とか標準エラーとかいう言葉をずいぶんいいかげんに使ってきたのである。これはまずい。ちゃんと考えてみなくては。

そんなことを考えながら whiptail メモ を書いていたら、なんだかファイルディスクリプタの話ばかり書いてしまった。

@kabipanotoko