如何使用重定向运算符将 stdin 发送到 while 循环

如何使用重定向运算符将 stdin 发送到 while 循环

不确定我在标题中使用的词语是否正确,我正在尝试这样做:

while read line; do
    echo "$line"
    exit;
done;  <( echo "foo\n"; exit )

但它挂起,我认为while循环没有从进程中获取任何输入echo。有谁知道这样做的正确方法以及为什么这是错误的?

我可以这样做:

echo "foo" | while read line; do echo "$line"; done;

但我希望采用第一种方式只是为了学习目的。我不确定是否需要流程替换。

答案1

如果您的脚本在循环之后继续并想要处理${line}.

去掉分号,并在done和 进程替换之间放置输入重定向:

done < <( echo "foo\n"; exit )

请注意,您不需要显式地exit终止进程替换的执行。

然而,对于文本文件处理,通常使用sed或更好、更安全awk,这也会产生更好的性能。如果您确实必须使用 Bash 来处理文本行,通常是非常建议这样做:(仅显示循环的第一行)

while IFS= read -r line ; do

除非你真的知道你需要别的。

这是对包含空格、换行符和反斜杠的输入行进行原始处理所必需的,否则 Bash 会解析、压缩和解释为(分别)分隔符和转义字符。

相关内容