sort -o
似乎是多余的。当我们可以使用的时候,使用它还有什么意义呢sort >
?
有时无法使用 shell 重定向吗?
答案1
就地对文件进行排序:
sort -o file file
使用sort file >file
首先将调用的文件截断file
到零大小,然后sort
使用该空文件进行调用,无论原始文件的内容是什么,都会产生一个空的输出文件。
此外,在命令或选项列表自动生成的通过例如脚本,添加-o somefile
到选项末尾将覆盖任何先前设置的输出文件,这允许通过附加选项来控制输出文件位置。
sort_opt=( some list of options )
if [ ... something ... ]; then
# We don't need to go through and delete any old use of "-o"
# because this later option would override it.
sort_opt+=( -o somefile.out )
fi
sort "${sort_opt[@]}" "$thefile"
还可能存在sort
直接调用二进制可执行文件的情况,而没有 shell 来对任何文件进行任何重定向。
请注意,这-o
是一个标准选项,而--output
是一个 GNU 扩展。
答案2
主要目的是能够就地对文件进行排序。您不能通过重定向来做到这一点,因为会在启动之前sort myfile >myfile
截断。myfile
sort
其特别有用的原因sort
是,sort
传统上的实现能够处理大文件(可能比 RAM 大得多),并且使用磁盘上的临时文件来执行此操作。相反,其他传统的文本处理实用程序主要设计为将文件作为流逐行处理,并且它们支持大文件,因为它们一次不需要在内存中保留多于几行。
这个能力早在第二版Unix。此版本记录了它将输入复制到临时文件。原因是它可以对 RAM 不足的大文件进行排序。 Unixsort
实用程序几乎从一开始就考虑到了大文件。
第二版手册没有明确说明输入文件可以与输出文件相同,我也找不到源代码来确认,但这可以从实现技术中得出。 (在第一版,手册没有提到什么特别的;我也找不到来源,但二进制在这种情况下不会产生正确的输出。)顺便说一句,在这些早期版本中,语法是sort input output
,还不是sort -o output input
,因为命令行选项的语法尚未牢固建立。
在第三版 Unix 中中,明确提到了就地排序的能力:用排序版本sort myfile
替换。myfile
在第四版 Unix 中,语法略有变化:sort myfile
将排序的输出写入标准输出,但sort myfile myfile
对文件进行就地排序(手册明确指出“输入和输出文件可能相同。”)。在第五版 Unix 中,指定输出文件的语法是现代-o
选项。
第五版是第一个支持合并模式(sort -m
)的,也是第一个支持多个输入文件的。这是相关的:合并模式仅对多个输入有用,而将多个文件排序在一起是一种罕见的需求,并且可以cat … | sort
在几乎没有性能损失的情况下完成(因为sort
无论如何都会将数据写入临时文件)。在合并模式下,sort
无法写入其中一个输入文件,因为在这种模式下,它一次一行读取所有输入并逐步写入输出,它不会复制。
写入输入文件的能力(合并模式除外)在整个 Unix 和(大多数)克隆的历史中一直被保留,并且是POSIX。