gpt4 book ai didi

while-loop - 过程的管道输出到 sh while 循环?

转载 作者:行者123 更新时间:2023-12-02 01:02:25 26 4
gpt4 key购买 nike

我试图在 while 循环中逐行循环 Perl 进程的输出。但是,我在语法上遇到困难。

我试过了,但得到了一个“不明确的重定向”错误:

#!/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 ...

但是 while 循环是在子 shell 中执行的,我需要在 while 循环中设置一些变量以在循环完成后保留,所以这不是一个选项。

我能做什么?

最佳答案

你快到了。试试这个:

while read -r line; do 
echo "$line"
# do stuff with $line
done < <(perl process.pl)

唯一的区别是 <而不是 $ .

$(cmd)是命令替换,它扩展为括号内命令的输出。另一方面,<(cmd)process substitution .请注意,这是一个 Bash 扩展,因此您还应该将 shebang 更改为 #!/bin/bash如果您想使用此方法。

或者,如果您不使用 Bash,则可以简单地使用管道代替:

perl process.pl | while read -r line; do 
echo "$line"
# do stuff with $line
done

顺便说一句,you almost always want to use the -r switch with read

关于while-loop - 过程的管道输出到 sh while 循环?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26912712/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com