UNIXの哲学では、1つのことを実行し、それを適切に実行します。テキストを処理するプログラムを作成します。これはユニバーサルインターフェイスであるためです。
sortコマンド、少なくともGNUソートは、持っている-o代わりに、ファイルに出力するオプションをstdout。なぜsort foobar -o whatever私がちょうどできるのに、なぜ便利なのsort foobar > whateverでしょうか?
UNIXの哲学では、1つのことを実行し、それを適切に実行します。テキストを処理するプログラムを作成します。これはユニバーサルインターフェイスであるためです。
sortコマンド、少なくともGNUソートは、持っている-o代わりに、ファイルに出力するオプションをstdout。なぜsort foobar -o whatever私がちょうどできるのに、なぜ便利なのsort foobar > whateverでしょうか?
回答:
GNUソートだけではありません。BSDソートにもあります。そして、なぜですか?
(私もそれは良い質問だと思った...)
manページから:「指定された引数は、標準出力の代わりに使用される出力ファイルの名前です。このファイルは、入力ファイルの1つと同じでもかまいません。」
リダイレクトで同じファイルに移動することはできません。出力のリダイレクトによりファイルが消去されます。
さらに明確にするために、ファイルを並べ替えて、並べ替えた結果を同じ場所に配置する場合は、試してみるとよいでしょう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のの第6版
ただし、Unixの哲学の範囲内ではないことに同意します。uniqそのオプションはありませんでした(そして当時sortもありませんでした-u)。
私のPDP-11では、1つのパラメーターを取る小さなプログラムを使用しました。
renac whatever
whatever既に存在している場合は、stdinから一時ファイルにすべてを書き込みます。一時ファイルはwhatever、stdin入力が枯渇した後にのみ名前が変更されます。そうすればrenac、入力を上書きすることなく、ファイル名にリダイレクトする代わりに、コマンドの出力をパイプすることができます。そのようにして上書きの問題を解決することは、私見がUnixの哲学により適合することです。
プログラムへのその後の追加は、標準入力に何も届いていない場合は出力ファイルを上書きしない(コマンドラインの一部のタイプミスの結果など)、および指定ファイルに標準入力を追加するオプションを許可します。
これは、私が作成した最初の(最初ではないにしても)実際のCプログラムの1つでした(私の仕事のために、私は主にそのシステムでPascalで開発しました)。
aptGNU / Linuxの人々は、機能の書き換えバージョンを持つことができます風味renacと呼ばれるプログラムを、提供spongeから(man:ファイルへの標準入力と書き込みを吸い取る), package 。moreutils`
spongeませんmoreutils。