我想对一个名为f
的文件进行排序,然后将文件排序的答案存储回f:
sort f >f
但是这个命令以空文件f
结束,为什么?如何使用一个命令来实现我的目标,而不是这样做:
sort f >1
mv 1 f
答案 0 :(得分:10)
shell在调用sort
命令之前创建输出文件。 (必须;否则它将无法重定向sort
命令stdout。)因此,当sort
命令开始以f
作为参数运行时,{{1是一个空文件。
您可以使用f
选项来避免这种情况:
-o
导致sort -o f f
程序本身在开始读取输入文件sort
之前创建输出文件f
。由于文件创建在类Unix系统上的工作方式,输入f
和输出f
实际上是两个不同的文件。
正如f
的POSIX规范所说:
-o 输出
指定要使用的输出文件的名称而不是标准输出。此文件可以与其中一个输入相同 文件。
答案 1 :(得分:5)
因为>
通过截断它来创建新文件。在sort f
命令运行之前,它首先由shell完成。
答案 2 :(得分:2)
因为shell必须设置重定向(通过调用dup2
并创建新文件)才能运行sort
您可以定义一些功能
autosort() {
mv $1 "$1.tmp$$"
sort "$1.tmp$$" > $1
}
然后使用autosort f