Answers:
不仅仅是GNU拥有它。BSD排序也有。至于为什么呢?
(我也认为这是一个很好的问题...)
在手册页中:“给定的参数是要使用的输出文件的名称,而不是标准输出。此文件可以与输入文件之一相同。”
您无法使用重定向转到同一文件,输出重定向会擦除该文件。
为了进一步阐明,如果我想对文件进行排序并将排序后的结果放在同一位置,我可能会想尝试一下sort < foo > foo
。除了输出重定向将截断文件foo
以准备接收输出。然后,没有任何东西可以排序。没有“ -o”的方法就是sort < foo > bar ; mv bar foo
。我认为该-o
选项可以执行类似的操作,而无需您担心。
sudo sort -o /some/place
使您的非特权用户没有写权限。
sponge
(moreutils的一部分)。对于特权重定向,存在到的管道传输| sudo tee
,这还具有将特权升级限制为单个简单程序的好处tee
。
-o
选择sort
存在早于海绵。它至少与4.4-lite2一样古老(这是OpenBSD CVS中历史记录的起点)。对于在非特权文件上进行操作并写入特权区域的情况,这种方法| sudo tee
效果很好,但是在大多数情况下,您希望整个事情都享有特权,然后使sudo
您绊倒。而且sudo grep file | sudo tee
很傻。
sort
在开始输出任何内容之前,需要先读取整个输入,这就是为什么它可以安全地覆盖其输入的原因。在开始输出之前,它可能会将数据存储在内存或临时文件中。
该“-o”选项已经在中sort
的的Unix第六版
但是,我同意您的看法,它不在Unix哲学之内。uniq
没有那个选择(sort
也没有-u
那个)。
在我的PDP-11上,我使用了一个带有一个参数的小程序:
renac whatever
如果whatever
已经存在,它将把从stdin到临时文件的所有内容都写入其中,该文件仅whatever
在stdin输入变干后才重命名为。这样,您可以将任何命令的输出通过管道renac
传递到其中,而不必重定向到文件名,而不会覆盖输入。以这种方式解决覆盖问题是恕我直言,它更符合Unix的哲学。
对该程序的一些后续补充是:如果stdin上没有到达任何内容(例如,由于命令行的一部分被误输入),则不覆盖输出文件;并允许将stdin附加到命名文件的选项。
这是我制作的第一个(如果不是第一个)真正的C程序之一(我的工作主要是在该系统上的Pascal上进行的)。
apt
调味GNU / Linux的人可以拥有的功能重写版本renac
提供了一个名为程序sponge
(来自man
:标准输入和写吸收到文件中), package
。moreutils`
sponge
也不moreutils
是由GNU实际创建的。