在一段时间内使用选择并不能给出我想要的结果

在一段时间内使用选择并不能给出我想要的结果

我有一个文件“in”,其中包含:

a
b
c

我运行以下命令:

cat in | while read el; do select yn in "yes" "no"; do echo $yn; done; done;

并得到以下输出:

1) yes
2) no
#?
#? 
#? 

我希望能够在每次迭代时输入 1 或 2。我需要做哪些不同的事情才能实现这一点?

答案1

您正在将输入导入 while 循环。在循环中,stdin 来自前面的命令,而不是从控制台。您的语句从该语句正在读取的select同一管道中读取。read

另外,您不需要cat

你需要保留标准输入用于 select 语句。试试这个:

while read el; do select yn in "yes" "no"; do echo $yn; break; 
done <&4; done 4<&0 < in

首先,请注意我们使用“<”而不是使用来重定向输入cat

这可以保留你的原产地标准输入(fd 0)在 fd 4 中,然后在循环内部将输入重定向到selectfd 4。

答案2

select将读取输入并重复执行直到 EOF;你几乎肯定想要的是表面上类似的:

cat in | while read el; do select yn in "yes" "no"; do echo $yn; break; done; done

相关内容