UNIX の哲学は、1 つのことを行い、それをうまく行うことです。テキストを処理するプログラムを作成してください。それが普遍的なインターフェイスだからです。
コマンドsort
、少なくとも GNU sort には、-o
の代わりにファイルに出力するためのオプションがあります。だけで済むのに、stdout
たとえば が便利なのはなぜでしょうか?sort foobar -o whatever
sort foobar > whatever
答え1
GNU ソートだけがそれを持っているわけではありません。BSD ソートにもそれがあります。そして、なぜでしょうか?
(私もそれは良い質問だと思いました...)
マニュアル ページから: 「指定された引数は、標準出力の代わりに使用される出力ファイルの名前です。このファイルは、入力ファイルの 1 つと同じにすることができます。」
リダイレクトを使用して同じファイルに移動することはできません。出力リダイレクトによりファイルが消去されます。
さらに明確に言うと、ファイルをソートして、ソートされた結果を同じ場所に置きたい場合は、 を試してみるとよいかもしれません。sort < foo > foo
ただし、出力リダイレクトは、出力を受け取る準備としてファイルを切り捨てますfoo
。すると、ソートするものがなくなります。「-o」を使用しない場合は、 になります。このオプションは、心配することなく同様のことを行うとsort < foo > bar ; mv bar foo
思います。-o
答え2
sort
'-o'オプションはすでにUnix 第 6 版
しかし、それが Unix の哲学の範囲内ではないという点については私も同意します。uniq
そのオプションはありませんでした (当時もsort
ありませんでした-u
)。
私の PDP-11 では、1 つのパラメータを取る小さなプログラムを使用しました。
renac whatever
すでに存在する場合はwhatever
、stdin からのすべての内容を一時ファイルに書き込み、whatever
stdin 入力が枯渇した後にのみ名前が変更されます。こうすることで、renac
入力を上書きすることなくファイル名にリダイレクトする代わりに、任意のコマンドの出力をパイプすることができます。上書きの問題をこのように解決することは、Unix の哲学にもっと適合していると思います。
プログラムに後から追加された機能には、stdin に何も到着しなかった場合に出力ファイルを上書きしない (たとえば、コマンドラインの一部を誤って入力した場合)、および指定されたファイルに stdin を追加するオプションを許可する、などがあります。
これは私が作成した最初の(最初ではないにしても)本物の C プログラムの 1 つです(仕事では主にそのシステムで Pascal を使用して開発していました)。