Bashシェルスクリプトで”while read”ループ内で”read”コマンドを使う方法
Contents
はじめに
決して多くないケースですが、 while read
ループ中で read
コマンドを利用したいという場合に起きる問題と、その対処法について紹介します。
検証環境
while read
ループ中で read
コマンドを利用するとどうなるか?
while read
ループ中で read
コマンドを利用するとどうなるか。
具体例をもとに見ていきます。
例えば、簡単な英単語の暗記スクリプトを作ってみます。
仕様は単純で、単語を1つ表示しては ENTER キーの入力を待つ、を繰り返します。
実行結果は以下のようになります。
ENTER キーの入力を求められないどころか、 two という単語が表示されていません。
cat words.txt | ...
のようにパイプを使わず、リダイレクトで読み込ませても結果は変わりません。
これはループ内の read
が パイプあるいはリダイレクトで渡された words.txt
の内容を読み込んでしまうことが原因です。
対処法 1 : while read
ループを避け for
ループを使用する
while read
を避けられるのなら for
ループに書き換えます。
ちゃんと、3 回 ENTER キーの入力を求められます。
対処法 2 : /dev/tty
から read
するように明示する
どうしても while read
を使いたい場合には、 ループ内の read
に対して TTY からの入力を待ち受けるように明示します。
ちゃんと、3 回 ENTER キーの入力を求められます。
ひとこと
たまたまインタラクティブな操作を求めるループ処理を書いたときに遭遇した問題でした。
ディスカッション
コメント一覧
まだ、コメントがありません