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。
我有一个包含以下内容的文件 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。