コマンドからファイルのリストを読み取り、ユーザーに各ファイルの入力を要求しようとします。 1つはファイル名を読み取るのに使用されread
、もう1つはユーザー入力を取得するために使用されていますが、このスクリプトは無限ループに陥るようです。
foo () {
echo "a\nb\nc" | while read conflicted_file;
do
echo $conflicted_file
while true; do
read -e -p "> " yn
case $yn in
[nN]* ) echo "success"; break;;
[yY]* ) echo "fail"; break;;
* ) echo "invalid input";;
esac
done
done;
}
foo
外部レイヤーを削除するとwhile read
トリックを実行しているようです。どんなアイデアがありますか?
ベストアンサー1
read
標準入力から読み取るので、両方ともread
標準入力で開いた同じパイプを介して出力から読み取られます。echo
read
パイプの外側の stdin からループ内を読み取るには、次のようにします。
foo () {
printf 'a\nb\nc\n' |
while IFS= read -r conflicted_file; do
printf '%s\n' "$conflicted_file"
while true; do
IFS= read <&3 -re -p "> " yn
case $yn in
[nN]* ) echo "success"; break;;
[yY]* ) echo "fail"; break;;
* ) echo "invalid input";;
esac
done
done
} 3<&0
つまり、foo
関数本体全体のfd 3にコピーします。