回答:
制御端末デバイスから読み取る:
read input </dev/tty
詳細:http : //compgroups.net/comp.unix.shell/Fixing-stdin-inside-a-redirected-loop
bash yourscript < /foo/bar
はユーザー入力を待ちますが、これはパスワードを読み取る場合にのみ許容されます。@GordonDavissonの回答は、他のすべての用途に適しています。
通常のstdinをユニット3にリダイレクトして、パイプライン内に取得し続けることができます。
{ cat notify-finished | while read line; do
read -u 3 input
echo "$input"
done; } 3<&0
ところで、実際にcat
この方法を使用している場合は、リダイレクトに置き換えれば、さらに簡単になります。
while read line; do
read -u 3 input
echo "$input"
done 3<&0 <notify-finished
または、そのバージョンでstdinとユニット3を交換できます。ユニット3でファイルを読み取り、stdinをそのままにしておきます。
while read line <&3; do
# read & use stdin normally inside the loop
read input
echo "$input"
done 3<notify-finished
read line
は通知終了read -u 3 input
からの読み取りですが、書かれたようにそれを実行した場合はコンソールからの読み取りです)?
このようにループを変更してみてください:
for line in $(cat filename); do
read input
echo $input;
done
単体テスト:
for line in $(cat /etc/passwd); do
read input
echo $input;
echo "[$line]"
done
2回読んだように見えますが、whileループ内の読み取りは必要ありません。また、catコマンドを呼び出す必要はありません。
while read input
do
echo $input
done < filename
read
の動作を「正しくない[ファイル]から読み込もうとしているためfilename
」と説明)と受け入れられた回答の両方から明らかです。