问题是当你有一个管道时:
command_1 | command_2
每个命令都在单独的子 shell 中运行,并带有父环境的单独副本。因此,该命令创建的任何变量,或它对现有变量所做的任何修改,都不会被包含的 shell 感知。
在您的情况下,您实际上并不需要管道,因为:
cat filename | command
在你需要的每一种方式上,都等同于:
command < filename
所以你可以写:
a=""; while read line; do a="$a $line"; done < american.0; echo $a
以避免创建任何子shell。
也就是说,根据这个 StackOverflow 答案,您不能真正依赖能够保存超过 1-4KB 数据的 shell 变量,因此您可能需要重新考虑您的整体方法。将整个单词列表存储在 shell 变量中可能不起作用,即使这样做,也可能无法正常工作。
编辑添加:要创建一个名为/tmp/american.tmp
包含变量的临时文件$a
,您可以编写:
while IFS= read -r line; do
printf %s " $line"
done < american.0 > /tmp/american.tmp