管道与流程替代

管道与流程替代

在尝试cat "$@"从任一标准输入读取数据时或者给定文件,事实证明管道和进程替换以不同方式处理丢失的尾随换行符:

printf %s foo > test.txt

unset REPLY
while read
do
    :
done < <(cat test.txt)
echo "$REPLY" # Prints foo

unset REPLY
cat test.txt | while read
do
    :
done
echo "$REPLY" # Prints nothing!

这是设计使然吗?这个“功能”是否记录在任何地方?

噢! @fered 有正确的想法 - 这只是变量值如何丢失的另一个例子,因为管道命令在子 shell 中运行

答案1

管道中的变量永远不会活着离开管道:)
进程替换将数据重定向到文件描述符。在幕后,该过程与管道不同|。以下内容有效,因为它们都在同一管道内。

unset REPLY
cat test.txt | { 
  while read ;do : ;done
  echo "$REPLY" 
} # Prints foo!

相关内容