bash 文件上的 cat 行为与存储文件内容的变量

bash cat behavior on file versus variables storing file contents

我有一个包含以下内容的文件 file1

Z 
X
Y

我可以使用cat查看文件:

$ cat file1
Z
X
Y

我可以对文件进行排序:

$ sort -k1,1 file1
X
Y
Z

我可以对其进行排序并将输出存储在变量中:

sorted_file1=$(sort -k1,1 file1)

但是当我尝试在变量 sorted_file1 上使用 cat 时,出现错误:

$ cat "$sorted_file1" 
cat: X
Y
Z: No such file or directory

我可以使用 echo,它看起来不错,但它在我的脚本中表现得很奇怪:

$ echo "$sorted_file1" 
X
Y
Z

为什么会这样?存储命令的输出如何改变 cat 解释它的方式?

是否有更好的方法将 shell 命令的输出存储在变量中以避免此类问题?

cat 对文件进行操作。您对 cat (cat "$sorted_file1") 的调用扩展为与 cat $'X\nY\nZ' 相同,当然没有该名称的文件,因此您会看到错误。

Shell 变量不是文件。如果你需要让它们的值像文件一样可用,你需要使用echo创建一个流:

echo "$sorted_file1" | cat    # portable, STDIN
cat <(echo "$sorted_file1")   # Bash, file
cat <<<"$sorted_file1"        # Bash, STDIN

(显然 cat 在这里毫无意义,但该原则适用于其他期望从文件或 STDIN 输入的程序。

你混合了两个概念,文件和变量。这两者都保存数据,但它们以不同的方式保存数据。

我假设您知道文件是什么。变量就像一个小数据存储。

您通常使用变量来存储您可能想要更改的少量数据,立即使用并且不介意在 script/program 结束时丢失。

并且您通常使用文件来存储大量数据,您希望在 script/program 结束后保留​​这些数据。

我相信您想在这里做的是对文件进行排序,并将输入存储在另一个文件中。为此,您需要使用重定向,例如

sort -k1,1 file1 > sorted_file1

这样做是对文件进行排序,然后将结果输出到名为 "sorted_file1" 的文件中。然后,如果您执行常规 cat sorted_file,您将看到排序后的内容,如您所料。

您可以阅读更多相关内容 here