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

时间:2016-01-20 22:00:29

标签: bash unix cat

我有一个文件file1,其中包含以下内容:

Z 
X
Y

我可以使用cat查看文件:

$ cat file1
Z
X
Y

我可以对文件进行排序:

$ sort -k1,1 file1
X
Y
Z

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

sorted_file1=$(sort -k1,1 file1)

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

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

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

$ echo "$sorted_file1" 
X
Y
Z

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

有没有更好的方法将shell命令的输出存储在变量中以避免这样的问题?

2 个答案:

答案 0 :(得分:1)

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输入的其他程序。

答案 1 :(得分:0)

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

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

您通常使用变量来存储您可能想要更改的一些数据,立即使用并且不介意在脚本/程序结束时丢失。

您通常使用文件来存储脚本/程序结束后要保留的大量数据。

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

sort -k1,1 file1 > sorted_file1

这样做是对文件进行排序,然后将结果输出到名为“sorted_file1”的文件中。然后,如果您按常规cat sorted_file进行操作,您将看到已排序的内容,如您所愿。

您可以阅读更多相关信息here