Bash: while read ループ内での入力の読み取りが機能しない

Bash: while read ループ内での入力の読み取りが機能しない

while readループ内での入力の読み取りは機能しないようです

while read line
do
 echo "get some input from the user"
 read response
done < some_file.txt

読み取りがループ外にあった場合のように実行が一時停止しません。これはなぜでしょうか? while read ループ内で入力を読み取るための回避策はありますか?

答え1

問題は、 と の両方read lineread responseからデータを期待し、取得することですstdin
この質問SO では、その一部がさらに詳しい情報へのリンクとともに説明されています。

要約
受け入れられた答えは次のように示唆しています:

制御端末デバイスから読み取り:read input </dev/tty

答え2

内部の読み取りコマンドで標準入力を使用し、while ループでは別のファイル記述子を使用する

while read -u 3 line; do
  read -p "get some input from the user" response
done 3< some_file.txt

答え3

Nifle さん、ありがとう! bgStack にも感謝します。何時間も検索して、ようやく答えが見つかりました! 素晴らしいです! ターミナル パスを検出するために「echo $(tty)」を使用しましたが、単に変数として取得することもできます。私にとっては、これは別のユース ケースでした。ファイルを読み込んでいて、実行を確認したいのです。以下の例が他の誰かの役に立つかもしれません。

#!/bin/bash

export terminal=$(tty)

cat file | while read val1 val2
do
   while true; 
            do
              read -p "would you like to XYZ" yn
              case $yn in
                        [Yy]* )     echo "# Move $val1 to $val2        #";break;;
                        [Nn]* )     echo "#---------no action----------#";break;;
                        * )         echo "# Please answer yes or no.   #";;
              esac
            done < $terminal
done

答え4

Nifle はまさにその通りです。ただし、複数の端末を使用する場合は、具体的に指定する必要があります。

Google からアクセスした方、このページを見つけられてありがとうございます。while 読み取りループ中にユーザー入力を行う必要がある場合 (これにはrm -i、、、readその他が含まれます)、使用する入力パイプを指定できます。

以下は私が使用したこのソリューションの一部です。

#in declarations
thistty=$(tty)

lsuser -R LDAP -a home pgrp ALL 2>/dev/null | while read line
do
   homedir=$(echo $homedir | awk -F= '{print $2}')
   sudo rm -ir "$homedir" < $thistty
done

関連情報