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


32

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

sortコマンド、少なくともGNUソートは、持っている-o代わりに、ファイルに出力するオプションをstdout。なぜsort foobar -o whatever私がちょうどできるのに、なぜ便利なのsort foobar > whateverでしょうか?


3
GNUはUNIXではありません。冗長な引数(--helpなど)など、多くの側面で異なります。
サキスク

@faifはい、それは本当です。しかし、それはこの特定の質問に対する答えではないと主張します。
-strugee

2
だからこそ、答えではなくコメントとして残しました:)
sakisk

回答:


47

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

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

リダイレクトで同じファイルに移動することはできません。出力のリダイレクトによりファイルが消去されます。

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


12
またsudo sort -o /some/place、非特権ユーザーに書き込み権限がないこともできます。
バハマ

8
そして、バハマットのコメントとの混乱を避けるために:彼は、彼らが彼らに許可を持っていないファイルを分類できると言っていません。I / Oリダイレクトは機能します... sudoでは不十分です。リダイレクトはシェルで行われるため(sudoは実行するコマンドにすぎません)、sudoを介してコマンドでリダイレクトを使用するのは面倒です。(バハマットが言っていることに関して最初は混乱していたので、他の人も混乱するかもしれないと考えた)。
kurtm

3
悪魔の擁護者を演じるためだけに、実際には「入力ファイルが出力ファイルと同じ」問題と「特権リダイレクト」問題の両方に代わるものがあり、どちらの選択肢も「1つのことをうまくやる」という精神にあります。「入力=出力」には、sponge(moreutilsの一部)があります。特権リダイレクトの場合、にパイピングがあります| sudo tee。これには、特権エスカレーションを単一の単純なプログラムに制限するという利点もありteeます。
jw013

良い点。スポンジが存在するずっと前-osort存在するオプションが。少なくとも4.4-lite2(OpenBSD CVSで歴史が始まった場所)と同じくらい古いです。また、非特権ファイルを操作して特権領域に書き込みを行っている場合はうまく機能しますが| sudo tee、ほとんどの場合、すべてのものを特権にしたいので、人をsudoつまずかせます。そしてsudo grep file | sudo tee愚かです。
kurtm

1
sort何も出力を開始する前に入力全体を読み取る必要があるため、入力を安全に上書きできます。出力を開始する前に、データをメモリまたは一時ファイルに保存する場合があります。
ステファンシャゼル

12

「-o」オプションは、すでにだったsortUnixのの第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`
41754

@uprego。私はちょうどsponge.cのソースを調べましたが、スポンジ(stdin-> stdout)機能のために多くのコードオーバーヘッドがあるようです。
アントン

@upregoもGNUによって実際に作成されたものでもありspongeませんmoreutils
jw013

私はそれを主張するつもりはありません。
41754
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.