Cygwin 使用“替换文件”;排序x.txt>;x、 txt";在锡温

Cygwin 使用“替换文件”;排序x.txt>;x、 txt";在锡温,cygwin,Cygwin,为什么“sort x.txt>x.txt”会清除文件内容,而“sort x.txt>y.txt”会像您预期的那样将排序后的文件写入y.txt?当您运行命令时,实际上是告诉shell打开x.txt进行写入(>>将被追加,这将不同),然后转储“sort x.txt”的结果由于它打开文件进行写入,首先,它有效地启动了一个名为x.txt的新文件,然后执行sort x.txt,对空文件进行排序 我不能肯定为什么会有这样的时间安排——但我相信这可能会阻止您尝试运行命令来写入您没有写入权限的文件,等等。(又名

为什么“sort x.txt>x.txt”会清除文件内容,而“sort x.txt>y.txt”会像您预期的那样将排序后的文件写入y.txt?当您运行命令时,实际上是告诉shell打开x.txt进行写入(>>将被追加,这将不同),然后转储“sort x.txt”的结果由于它打开文件进行写入,首先,它有效地启动了一个名为x.txt的新文件,然后执行sort x.txt,对空文件进行排序


我不能肯定为什么会有这样的时间安排——但我相信这可能会阻止您尝试运行命令来写入您没有写入权限的文件,等等。(又名-它首先打开它进行写入,以确保它可以)。

shell在调用命令
sort x.txt
之前会截断
x.txt
,因此,当sort命令运行时,就没有什么可排序的了


几乎所有的shell都是这样运行的(包括windowscmdwindow);这不仅仅是Cygwin的一项功能。

对a>b进行排序打开a和b,a用于读取,b用于写入。至于b的写作,它将被清除

执行命令时,shell首先打开输出文件,将程序输出写入其中,有效地将其截断为零长度。然后它启动sort命令,在
sort x.txt>x.txt
的情况下,当shell看到命令
sort x.txt>x.txt
时,它会对新的空文件
x.txt

进行排序,它会看到sort命令的输出需要进入文件
x.txt
,因此它会打开文件
x.txt
,进行写入,如果文件中已经有任何内容,这将清除该文件的内容


如果要避免这种情况,可以将排序输出重定向到临时文件,然后将临时文件重命名为x.txt

这是关于bash shell脚本的。我不确定大家的共识是什么,但这对superuser.com来说可能更好,因为这与编程本身无关。这不是cygwin的特定行为……我不确定你所说的“如你所料”是什么意思。如果您发出截断x.txt的命令,我希望x.txt为空。