2
1

More than 5 years have passed since last update.

while read でファイル入力する時、標準以外の入力を指定すると便利

Last updated at Posted at 2013-08-08

すみません。「すると便利」は言い過ぎました。すみません。

便利なときがあります。

以下のような場合です。

while read LINE 0<&9
do
  echo $LINE
  confirm '続行します。いいですか?'
done 9< $0

なんでかつーと、while の内部の標準入力はすべてファイルに置換されてしまうからです。

ファイルから読み取りながら何か処理をして、必要に応じて y/n を入力させるようなことを考えるときに困ったりします。しました。

失敗したパターン(標準入力をリダイレクト)

以下のようにしたら、confirm の中の read もファイルから読み込んで失敗しました。

function confirm()
{
  echo "${0} (y or n)"
  read IN
  if [ "${IN}" = "n" ];
  then
    exit 1
  fi
}

while read LINE
do
  echo $LINE
  confirm '続行します。いいですか?'
done < $0

うまくいかなかった対策

泥縄的に、read コマンドの入力を明示的に /dev/tty に変えました。強制でコンソールから入力させる感じですね。

function confirm()
{
  echo "${0} (y or n)"
  read IN < /dev/tty
  if [ "${IN}" = "n" ];
  then
    exit 1
  fi
}

基本的にはこれでうまく動くのですが、こうしちゃうと yes コマンドなどが利用できなくなるので不便だと思いました。

2
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
1