为什么排序f> f会删除所有内容?

时间:2013-05-12 06:46:01

标签: linux bash sorting

我想对一个名为f的文件进行排序,然后将文件排序的答案存储回f:

sort f >f

但是这个命令以空文件f结束,为什么?如何使用一个命令来实现我的目标,而不是这样做:

sort f >1
mv 1 f

3 个答案:

答案 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