【问题标题】:bash cat behavior on file versus variables storing file contents文件上的 bash cat 行为与存储文件内容的变量
【发布时间】:2016-01-20 22:00:28
【问题描述】:

我有一个文件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 命令的输出存储在变量中以避免此类问题?

【问题讨论】:

  • 所以我应该一直使用echo ?
  • cat file1 打印指定文件的内容,而不是名称本身。为什么你会期望与cat "$sorted_file1" 有不同的行为?
  • 不管怎样,您可以使用cat <<< "$sorted_file1" 作为 echo 的替代品。
  • 我希望cat file1 以与打印命名文件内容相同的方式打印变量的内容。显然这是不正确的。
  • cat 没有将变量作为参数; shell 将变量扩展为它的值,cat 接收 that 作为它的参数。

标签: bash unix cat


【解决方案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 输入的程序)。

【讨论】:

  • 太好了,谢谢!我不明白 cat 只对文件进行操作,很高兴知道!
【解决方案2】:

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

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

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

而且您通常使用文件来存储大量数据,您希望在脚本/程序结束后保留​​这些数据。

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

sort -k1,1 file1 > sorted_file1

它的作用是对文件进行排序,然后将结果输出到一个名为“sorted_file1”的文件中。然后,如果您执行常规的cat sorted_file,您将看到按预期排序的内容。

您可以阅读更多关于它的信息here

【讨论】:

  • 谢谢彼得。我实际上想避免编写这个临时文件,因为我在几个不同的输入文件上同时运行这个脚本,并且每次运行程序时这个文件(配置文件)都必须是唯一的。最初我按照您的建议做了,但它导致程序在有时间删除文件之前使用上一次运行的配置文件进行新的运行。再次感谢。
  • 如果这就是你想要做的,那么你可以直接解决这个问题。如果您尝试对大量数据进行排序,则尤其如此。为此使用变量可能会遇到其他问题,例如内存分配问题,特别是如果您同时运行多种排序。有关如何创建唯一临时文件的建议,请参阅 herehere。还有其他一些suggested reading
  • 谢谢彼得,我去看看!
  • 嘿@Peter 只是想让你知道,我最终确实浏览了你链接到的帖子,发现它们非常有用。我现在一直在使用 mktemp 在我的脚本中生成临时文件,它运行良好,非常感谢!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多