は1つだけあり/dev/stdin
、read
使用されている場所であればどこからでも読み取ります(デフォルト)。
解決策は、1(/dev/stdin
)の代わりに他のファイル記述子を使用することです。
同等のコード(bashの場合)から投稿したもの[1](以下を参照)
に追加して0</dev/tty
(たとえば)、「実際の」ttyから読み取るだけです。
while read a b c
do read -p "Enter a number: " d 0</dev/tty # 0<&2 is also valid
echo "$a -> $b -> $c and ++> $d"
done <<<"$(echo -e '1 2 3\n4 5 6')"
実行時:
$ ./script
Enter a number: 789
1 -> 2 -> 3 and ++> 789
Enter a number: 333
4 -> 5 -> 6 and ++> 333
他の選択肢は使用することです0<&2
(奇妙に見えるかもしれませんが、有効です)。
/dev/tty
(また0<&2
)からの読み取りはスクリプトの標準入力をバイパスし、これはエコーから値を読み取らないことに注意してください:
$ echo -e "33\n44" | ./script
その他の解決策
1つの入力を他のfd(ファイル記述子)にリダイレクトする必要があります。
ksh、bash、zshで有効:
while read -u 7 a b c
do printf "Enter a number: "
read d
echo "$a -> $b -> $c and ++> $d"
done 7<<<"$(echo -e '1 2 3\n4 5 6')"
または、execを使用:
exec 7<<<"$(echo -e '1 2 3\n4 5 6')"
while read -u 7 a b c
do printf "Enter a number: "
read d
echo "$a -> $b -> $c and ++> $d"
done
exec 7>&-
shで動作するソリューション(<<<
動作しません):
exec 7<<-\_EOT_
1 2 3
4 5 6
_EOT_
while read a b c <&7
do printf "Enter a number: "
read d
echo "$a -> $b -> $c and ++> $d"
done
exec 7>&-
しかし、これはおそらく理解しやすいでしょう:
while read a b c 0<&7
do printf "Enter a number: "
read d
echo "$a -> $b -> $c and ++> $d"
done 7<<-\_EOT_
1 2 3
4 5 6
_EOT_
1よりシンプルなコード
あなたのコードは:
echo -e "1 2 3\n4 5 6" |\
while read a b c;
do
echo "$a -> $b -> $c";
echo "Enter a number: ";
read d ;
echo "This number is $d" ;
done
簡略化されたコード(bash)は次のとおりです。
while read a b c
do #0</dev/tty
read -p "Enter a number: " d ;
echo "$a -> $b -> $c and ++> $d";
done <<<"$(echo -e '1 2 3\n4 5 6')"
実行すると、次のように表示されます。
$ ./script
1 -> 2 -> 3 and ++> 4 5 6
これは、変数dが同じものから読み取られていることを示してい/dev/stdin
ます。