在尝试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!