我正在使用bash脚本,如下所示,
cat filename | while read line
do
read input;
echo $input;
done
但是这显然没有给我正确的输出,因为我在while循环中读取它会尝试从文件文件名中读取,因为可能的I / O重定向。
还有其他方法吗?
答案 0 :(得分:94)
从控制终端设备读取:
read input </dev/tty
更多信息:http://compgroups.net/comp.unix.shell/Fixing-stdin-inside-a-redirected-loop
答案 1 :(得分:51)
您可以将常规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和unit 3 - 使用单元3读取文件,然后只保留stdin:
while read line <&3; do
# read & use stdin normally inside the loop
read input
echo "$input"
done 3<notify-finished
答案 2 :(得分:6)
尝试改变这样的循环:
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
答案 3 :(得分:5)
看起来你读了两次,不需要在while循环中读取。此外,您不需要调用cat命令:
while read input
do
echo $input
done < filename
答案 4 :(得分:1)
我发现该参数-u已读取。
“-u 1”表示“从标准输入中读取”
while read -r newline; do
((i++))
read -u 1 -p "Doing $i""th file, called $newline. Write your answer and press Enter!"
echo "Processing $newline with $REPLY" # united input from two different read commands.
done <<< $(ls)
答案 5 :(得分:-5)
echo "Enter the Programs you want to run:"
> ${PROGRAM_LIST}
while read PROGRAM_ENTRY
do
if [ ! -s ${PROGRAM_ENTRY} ]
then
echo ${PROGRAM_ENTRY} >> ${PROGRAM_LIST}
else
break
fi
done