为什么排序-o有用?


32

UNIX哲学说:一件事做好。制作处理文本的程序,因为这是一个通用接口。

sort命令(至少是GNU排序)可以-o选择输出到文件而不是stdout。例如,为什么sort foobar -o whatever在我可以的时候有用sort foobar > whatever


3
GNU不是UNIX。在许多方面,它是不同的,例如冗长的参数(--help等)。
sakisk 2013年

@faif是的,这是真的。但是我认为这不是这个特定问题的答案。
奋斗

2
这就是为什么我把它留为评论而不是回答:)
sakisk

Answers:


47

不仅仅是GNU拥有它。BSD排序也有。至于为什么呢?
(我也认为这是一个很好的问题...)

在手册页中:“给定的参数是要使用的输出文件的名称,而不是标准输出。此文件可以与输入文件之一相同。”

您无法使用重定向转到同一文件,输出重定向会擦除该文件。

为了进一步阐明,如果我想对文件进行排序并将排序后的结果放在同一位置,我可能会想尝试一下sort < foo > foo。除了输出重定向将截断文件foo以准备接收输出。然后,没有任何东西可以排序。没有“ -o”的方法就是sort < foo > bar ; mv bar foo。我认为该-o选项可以执行类似的操作,而无需您担心。


12
您还可以sudo sort -o /some/place使您的非特权用户没有写权限。
bahamat

8
为了避免混淆bahamat的评论,他不是在说他们可以对自己没有权限的文件进行排序。I / O重定向可以正常工作... sudo效果很差。由于重定向发生在您的shell中(sudo只是它要运行的命令),因此通过sudo对命令使用重定向非常烦人。(我最初对巴哈马特在说什么感到困惑,所以认为其他人也可能感到困惑)。
kurtm

3
只是为了扮演魔鬼的提倡者,“输入文件与输出文件相同”问题和“特权重定向”问题实际上都有替代方案,而这两种替代方案都更多地本着“做好一件事情”的精神。对于“输入=输出”,有sponge(moreutils的一部分)。对于特权重定向,存在到的管道传输| sudo tee,这还具有将特权升级限制为单个简单程序的好处tee
jw013

好点。虽然-o选择sort存在早于海绵。它至少与4.4-lite2一样古老(这是OpenBSD CVS中历史记录的起点)。对于在非特权文件上进行操作并写入特权区域的情况,这种方法| sudo tee效果很好,但是在大多数情况下,您希望整个事情都享有特权,然后使sudo您绊倒。而且sudo grep file | sudo tee很傻。
kurtm

1
sort在开始输出任何内容之前,需要先读取整个输入,这就是为什么它可以安全地覆盖其输入的原因。在开始输出之前,它可能会将数据存储在内存或临时文件中。
斯特凡Chazelas

12

该“-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`
41754

@uprego。我只是看了sponge.c的来源,由于具有海绵化功能(stdin-> stdout),它似乎有很多代码开销。
Anthon

@uprego sponge也不moreutils是由GNU实际创建的。
jw013

我无意断言。
1754年
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.