过程的管道输出到SH while循环?(piping output of process to sh

2019-10-21 06:21发布

我试图遍历一个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环路保持循环结束后,所以这不是一个选项。

我能做什么?

Answer 1:

你快到了。 尝试这个:

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与读开关



Answer 2:

使用命名管道; 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循环开始消耗输出。



Answer 3:

使用此文档 :

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


文章来源: piping output of process to sh while loop?
标签: while-loop sh