cat命令:意外输出

时间:2013-12-16 10:12:45

标签: bash shell unix cat

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

然而,当我尝试$cat < text > newtext时,它有效! newtexttext的副本。

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

3 个答案:

答案 0 :(得分:4)

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

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

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

cat text > newtext && mv newtext text

答案 1 :(得分:2)

使用

将输出重定向到文件时
echo "something" > file.txt

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

只需调用

即可显示文件内容
cat file.txt

为了达到你所尝试的目的,你可以做到

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

但我没有看到你想要这样做的原因。

答案 2 :(得分:1)

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

这显然没有意义,因此当shell解析您的命令时,必须首先完成重定向,因为>在读取之前覆盖文件clobbered的内容 ie < / em>它是空的!