在 sh 中逐行读取命令输出(非 bash)

4

我基本上正在寻找一种方法来做到这一点。

list=$(command)
while read -r arg
do
        ...
done <<< "$list"

使用sh代替bash。由于最后一行的原因,代码无法运行如下:

syntax error: unexpected redirection

有任何修复方法吗?

编辑:我需要编辑变量并在循环外访问它们,因此不接受使用|(因为它会创建具有独立作用域的子 shell)。

编辑 2:这个问题与为什么我的 Bash 计数器在 while 循环后重置不同,因为我没有使用|(正如我在最后一个编辑中注意到的)。我正在寻求另一种实现方式。(链接问题的答案只解释了问题发生的原因,但没有提供任何适用于 sh(无 bash)的解决方案。)


http://mywiki.wooledge.org/BashFAQ/024 - tripleee
1
可能是为什么我的Bash计数器在while循环后重置的重复问题。 - tripleee
为什么有些人在没有阅读问题内容的情况下就将其标记为重复并投票关闭?这个问题与@tripleee链接的问题无关。那只是为了说明其他人提出的一些解决方案是不正确的,而我已经在我的问题中指出了这一点。 - José D.
@tripleee 哪一个?两者都不适用,唯一的是命名管道,但会留下文件。 - José D.
“命令分组”是一种便携且有良好文档记录的解决方法。 - tripleee
显示剩余2条评论
2个回答

3

在 POSIX sh 中没有纯语法的方法来实现这一点。您需要使用临时文件来存储命令的输出,或者使用命名管道。

mkfifo output
command > output &

while read -r arg; do
    ...
done < output
rm output

1

有什么原因你不能这样做?应该可以运行,除非在循环内部分配了任何变量,你希望在完成后可见。

 command |
 while read -r arg
 do
         ...
 done

已经尝试过了,问题是我在循环内部分配变量,并且希望它们在完成后可见 D: - José D.
那么,如果不先将command的结果导入到临时文件中,然后使用<将数据输入循环中,我就看不出有其他方法可以实现这个功能了。 - eduffy

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接