【问题标题】:cat command: unexpected outputcat 命令:意外输出
【发布时间】:2013-12-16 10:12:44
【问题描述】:

我尝试了以下命令$cat < text > text,其中text 是一个非空文件。 标准输出没有输出,文件text 变为空白。我希望 cat 命令读取文件文本并将内容输出到同一个文件。

但是,当我尝试 $cat < text > newtext 时,它可以工作! newtexttext 的副本。

另一个疑问,当我尝试$cat < text >>text 时,>> 通常会附加到文件中。我的终端陷入无限循环,文件text 被反复附加到自身。为什么会这样?

【问题讨论】:

  • 你这样做有什么特别的原因吗?
  • 无特殊原因。

标签: bash shell unix cat


【解决方案1】:

您不能使用与 stdin 和 stdout 相同的文件。为什么?因为所有命令都是同时执行的,而且shell在执行命令之前会准备好重定向。因此,输出文件在执行前被清空。

相反,您必须使用临时文件。

解决方法可能是您的解决方案,也可能是:

cat text > newtext && mv newtext text

【讨论】:

    【解决方案2】:

    当您将输出重定向到文件时

    echo "something" > file.txt
    

    首先发生的是您的文件被(重新)创建。如果存在,它将被清空,而这正是您所看到的。

    你可以通过简单的调用来显示文件的内容

    cat file.txt
    

    要实现你所尝试的,你可以做

    cat file.txt > temp.txt && mv temp.txt file.txt
    

    但我看不出你为什么要这样做。

    【讨论】:

      【解决方案3】:

      如果您考虑一下,shell 必须首先进行重定向。如果 shell 实际按照您的预期从左到右执行命令,那么 cat file 会将文件内容显示到终端,然后 shell 会看到 > file 并且必须回溯 清除输出从终端重新运行命令并重定向 stdout

      这显然没有意义,所以当 shell 解析你的命令时,必须首先完成重定向,因为> 覆盖了你的文件在读取之前是clobbered 的内容空的!

      【讨论】:

        猜你喜欢
        • 2012-10-08
        • 2014-04-04
        • 1970-01-01
        • 2013-08-11
        • 2016-03-10
        • 1970-01-01
        • 2021-04-29
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多