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で開発しました)。
apt
GNU / Linuxの人々は、機能の書き換えバージョンを持つことができます風味renac
と呼ばれるプログラムを、提供sponge
から(man
:ファイルへの標準入力と書き込みを吸い取る), package
。moreutils`
sponge
ませんmoreutils
。