web-dev-qa-db-ja.com

sort -oが便利なのはなぜですか?

UNIXの哲学は、1つのことを実行し、それをうまく実行することです。テキストを処理するプログラムを作成します。これは、それがユニバーサルインターフェイスであるためです。

sortコマンドには、少なくともGNUソート、-oオプションをstdoutではなくファイルに出力します。なぜですか、sort foobar -o whateverできるときに便利ですsort foobar > whatever

32
strugee

GNUソートはそれだけではありません。BSDソートにもそれがあります。なぜですか?
(それも良い質問だと思いました...)

Manページから:「指定された引数は、標準出力の代わりに使用される出力ファイルの名前です。このファイルは、入力ファイルの1つと同じにすることができます。」

リダイレクトを使用して同じファイルに移動することはできません。出力リダイレクトはファイルをワイプします。

さらに明確にするために、ファイルを並べ替えて、並べ替えた結果を同じ場所に配置したい場合は、sort < foo > foo。出力リダイレクトを除いて、出力を受信する準備としてファイルfooを切り捨てます。そして、ソートするものは何もありません。 「-o」がなければ、それを行う方法はsort < foo > bar ; mv bar foo-oオプションは、心配することなく、同様のことを行います。

47
kurtm

「-o」オプションはすでに Sixth Edition of Unixsortに含まれていました

ただし、これはUnixの哲学の範囲外であることに同意します。 uniqにはそのオプションがありませんでした(そしてsortには-uがありませんでした)。

私のPDP-11では、1つのパラメーターを取る小さなプログラムを使用しました。

renac whatever

whateverがすでに存在する場合は、stdinからテンポラリファイルにすべてが書き込まれ、stdin入力が枯渇した後にのみ、whateverに名前が変更されました。これにより、入力を上書きすることなく、ファイル名にリダイレクトする代わりに、コマンドの出力をrenacにパイプすることができます。このようにして上書きの問題を解決することは、私見がよりUnixの哲学に準拠することです。

プログラムへのその後のいくつかの追加は次のとおりです。標準入力に何も到着しなかった場合(たとえば、コマンドラインの一部を誤って入力した結果)に出力ファイルを上書きせず、指定されたファイルに標準入力を追加するオプションを許可しました。

これは、私が作成した最初の(最初ではないにしても)真のCプログラムの1つでした(私の仕事のほとんどは、そのシステムのPascalで開発しました)。

12
Anthon