我试图遍历一个Perl过程的输出,一行行,一内while
循环。 然而,我在与语法的难度。
我想这一点,但有一个“暧昧重定向”错误:
#!/bin/sh
while read line; do
echo "$line"
# do stuff with $line
done < $(perl process.pl)
./script.sh : line 6: $(perl process.pl): ambiguous redirect
例如,一个(低效)的解决办法是:
#!/bin/sh
tmpFile=/tmp/tmpFile.txt
perl process.pl > $tmpFile
while read line; do
echo "$line"
# do stuff with $line
done < $tmpFile
我知道我可以管的Perl程序的while
循环为:
perl process.pl | while ...
但同时循环在子Shell中执行,我需要一些变量的设置while
环路保持循环结束后,所以这不是一个选项。
我能做什么?
你快到了。 尝试这个:
while read -r line; do
echo "$line"
# do stuff with $line
done < <(perl process.pl)
唯一不同的是<
而不是$
。
$(cmd)
是一个命令替换,扩展到命令的括号内的输出。 在另一方面, <(cmd)
是一个过程替代 。 请注意,这是一个bash的扩展,所以你也应该改变你的家当是#!/bin/bash
,如果你想使用此方法。
另外,如果你不使用bash,你可以简单地使用一个管道,而不是:
perl process.pl | while read -r line; do
echo "$line"
# do stuff with $line
done
顺便说一句, 你几乎总是要使用-r
与读开关
使用命名管道; bash
进程替换基本上是围绕这句法糖。
mkfifo output
perl process.pl > output &
while IFS= read -r line; do
echo "$line"
# do stuff with $line
done < output
rm output
命名管道不需要process.pl
完成之前while
循环开始消耗输出。
使用此文档 :
while IFS= read -r line; do
echo "$line"
# do stuff with $line
done <<EOF
$(perl process.pl)
EOF