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