为什么 sort 有一个 --output= 选项?

Emm*_*maV 12 options sort

sort -o似乎是多余的。当我们可以使用的时候,使用它还有什么意义呢sort >

有时无法使用 shell 重定向吗?

Kus*_*nda 22

就地对文件进行排序:

sort -o file file
Run Code Online (Sandbox Code Playgroud)

使用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"
Run Code Online (Sandbox Code Playgroud)

还可能存在sort直接调用二进制可执行文件的情况,而没有 shell 来对任何文件进行任何重定向。

请注意,这-o是一个标准选项,而--output是一个 GNU 扩展。

  • 请注意,“`>` 是一个 shell 构造。如果您只想运行一个命令将某些内容排序到文件中,为什么要启动 shell”对我来说是一种获胜论点。它是可移植的、简单的,当然,对于某些用例来说这是多余的事情,但老实说,用多种易于理解的方法来做同一件事本身并不是一件坏事。 (8认同)
  • POSIX 文本至少暗示了这一点:_“-o 输出:指定要使用的输出文件的名称,而不是标准输出。**此文件可以与输入文件之一相同**。”_但话又说回来,并不是所有工具的所有选项都有一个确定的用例,您应该使用它们。无论如何,“sort”都需要缓冲内存中的所有内容,因此只有在读取所有输入后才能打开输出文件,这几乎是免费的。与“sed”或“cat”不同,这样做需要添加缓冲。 (7认同)
  • @EmmaV [GNU 文档](https://www.gnu.org/software/coreutils/manual/html_node/sort-inspiration.html) 说“将输出写入输出文件而不是标准输出。通常,排序会读取所有内容在打开输出文件之前输入,因此您可以使用 sort -o FF 和 cat F | sort -o F 等命令就地对文件进行排序。” (3认同)

Gil*_*il' 13

主要目的是能够就地对文件进行排序。您不能通过重定向来做到这一点,因为会在启动之前sort myfile >myfile截断。myfilesort

\n

其特别有用的原因sort是,sort传统上的实现能够处理大文件(可能比 RAM 大得多),并且使用磁盘上的临时文件来执行此操作。相反,其他传统的文本处理实用程序主要设计为将文件作为流逐行处理,并且它们支持大文件,因为它们一次不需要在内存中保留多于几行。

\n

这种能力早在Unix 第二版中就被引入了。此版本记录了它将输入复制到临时文件。原因是它可以对 RAM 不足的大文件进行排序。Unixsort实用程序几乎从一开始就考虑到了大文件。

\n

第二版手册没有明确说明输入文件可以与输出文件相同,我也找不到源代码来确认,但这可以从实现技术中得出。(在第一版中,手册没有提到什么特别的;我也找不到源代码,但在这种情况下二进制文件不会产生正确的输出。)顺便说一句,在这些早期版本中,语法是sort input output,还没有sort -o output input因为命令行选项的语法尚未确定。

\n

在第三版 Unix 中,明确提到了就地排序的能力:用排序版本sort myfile替换。在第四版Unix中,语法略有变化:将排序后的输出写入标准输出,但对文件进行就地排序(手册明确指出\xe2\x80\x9c的输入和输出文件可能是相同的\xe2\x80\ x9d)。在第五版 Unix 中,指定输出文件的语法是现代的myfilesort myfilesort myfile myfile-o选项。

\n

第五版是第一个支持合并模式(sort -m)的,也是第一个支持多个输入文件的。这是相关的:合并模式仅对多个输入有用,而将多个文件排序在一起是一种罕见的需求,并且可以在cat \xe2\x80\xa6 | sort几乎没有性能损失的情况下完成(因为sort无论如何都会将数据写入临时文件)。在合并模式下,sort无法写入其中一个输入文件,因为在这种模式下,它一次一行读取所有输入并逐步写入输出,它不会复制。

\n

写入输入文件的能力(合并模式除外)在 Unix 和(大多数)克隆的历史中一直保留,并且是POSIX所要求的。

\n