UNIX 哲学说:做一件事并把它做好。编写处理文本的程序,因为这是一个通用界面。
该sort
命令(至少是 GNU sort)可以-o
选择输出到文件而不是stdout
.比如说,sort foobar -o whatever
当我可以的时候为什么有用sort foobar > whatever
?
答案1
不仅仅是 GNU 类拥有它。 BSD 排序也有它。至于为什么?
(我也觉得这个问题问得好……)
从手册页来看:“给出的参数是要使用的输出文件的名称,而不是标准输出。该文件可以与输入文件之一相同。”
您无法通过重定向转到同一文件,输出重定向会擦除该文件。
为了进一步澄清,如果我想对文件进行排序并将排序后的结果放在同一个地方,我可能会考虑尝试sort < foo > foo
。除了输出重定向会截断文件foo
以准备接收输出。然后就没有什么可以排序的了。如果没有“-o”,这样做的方法是sort < foo > bar ; mv bar foo
。我认为该-o
选项会执行类似的操作,而无需您担心。
答案2
'-o' 选项已经sort
在Unix 第六版
不过我同意你的观点,它不属于 Unix 哲学。uniq
没有那个选项(并且sort
没有-u
然后)。
在我的 PDP-11 上,我使用了一个带有一个参数的小程序:
renac whatever
如果whatever
已经存在,它会将 stdin 中的所有内容写入临时文件,该文件仅whatever
在 stdin 输入枯竭后才重命名。这样您就可以将任何命令的输出通过管道传输到renac
而不是重定向到文件名,而不会覆盖输入。以这种方式解决覆盖问题恕我直言更符合Unix哲学。
后来对该程序的一些补充是:如果标准输入上没有任何内容(例如,由于命令行部分输入错误而导致),则不覆盖输出文件,并允许将标准输入附加到指定文件的选项。
这是我制作的第一个(如果不是第一个)真正的 C 程序(对于我的工作,我主要在该系统上使用 Pascal 开发)。