我尝试了以下命令$cat < text > text
,其中text
是非空文件。
stdout没有输出,文件text
变为空白。我期望cat命令读取文件文本并将内容输出到同一文件。
然而,当我尝试$cat < text > newtext
时,它有效! newtext
是text
的副本。
另一个疑问,当我尝试$cat < text >>text
>>
通常附加到文件时。我的终端卡在无限循环中,文件text
重复附加到自身。为什么会这样?
答案 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>它是空的!