STDOUTで印刷することと出力ファイルに直接書き込む[閉じる]

STDOUTで印刷することと出力ファイルに直接書き込む[閉じる]

プログラムの結果を基本的に標準出力として印刷する必要がある場合と、出力ファイルを引数の1つとして受け入れて書き込むことがより適切な方法である場合、経験に基づく規則はありますか?いつでも標準出力をファイルにリダイレクトできます。

私は他のプログラムがあることを知っています。たとえば、結果が単一のファイルではなく複数のファイルの場合、stdoutとして印刷することは意味がありません。プログラムの出力が一時的な場合、出力ファイルを引数として受け入れることも意味がありません。

しかし、最終的に単一のファイルに配置する必要がある出力を生成するプログラムはどうですか?これらのプログラムは、stdinから入力を受け取るプログラムと引数から入力を受け取るプログラムにさらに分けることができます。

答え1

いくつかの実際の例:


出力をstdoutに送信するアプリケーションは、通常、アプリケーションが正常に動作していることを意味します。どんなタイプ受信者には、パイプやソケットでも動作するデータストリームを送信します。これがUNIXパイプの特性です。もし経験上の法則があれば、おそらくこれが最高の候補でしょう。


一方、-o <output-file-name>アプリケーションが好む場合必要その出力を取得します。

もちろん、lseek(2)標準出力を無視することもできます(実際に検索可能な場合)、これは通常予期しない動作です。

もちろん、入力にも同様に適用されます。


ファイルから/ファイルにリダイレクトするにはシェルが必要です。シェルがなくても、特別なオプションパラメータが許可されます。


ファイルから/にリダイレクトすると、ファイルの場所(見つかった場合)または複数のアプリケーション間のパイプ/ソケット接続を簡単に共有できます。これはシェルスクリプトで役に立つ機能です。たとえば、次のようになります。

{
    echo hello world
    head -c 10
    seq 10 | awk '{print "amazing text-manipulation of", $0}'
    dd bs=1024 count=1 seek=32
    echo farewell
} < /dev/random > recipient-file

-o recipient-fileオプション(または)にのみ依存することは-i /dev/random(そう簡単に)許可されていません。


場合によっては、上記とは反対の場合があります。-o <output-file-name>オプションを使用すると、アプリケーションの出力を生成できます。いいえ他のアプリケーションと共有すると、標準出力が汚染されます。例:

strace -o prog.strace output-producer > prog.output

入力、所有アプリケーションも同様です。いいえ共有標準入力を使用します。

unwanted-consumer -i /dev/null desired-consumer

stdin/stdout にのみ依存するには、次の追加のシェル階層が必要です。

strace > prog.strace sh -c 'output-producer > prog.output'

または標準入力の場合:

unwanted-consumer 3<&0 < /dev/null sh -c 'desired-consumer <&3'

コマンドの簡潔さ/簡潔さとシェルの必要性に加えて、シェル呼び出しにはターゲットにするかoutput-producer調整する必要があるかもしれないわずかに異なる環境が含まれており、desired-consumer全体的な負担が加重されます。

答え2

プログラムの出力が別のプログラムの入力として使用され、出力がデフォルトでテキストの場合は、stdoutをデフォルトに設定すると、プログラムをパイプラインの一部として簡単に使用できます。

一方、出力が通常バイナリまたは非常に大きい場合(与えられた入力と比較して)、デフォルトではファイル名を要求し、明示的に要求しない限り、端末からの印刷を拒否するのが合理的です。

最初のグループでは、他のプログラムを提供するパイプラインの一部としてだけでなく、ユーザーが直接読み取ることができる出力を提供するのにも同様に有効な、、grepなどsortを考慮してください。cutほとんどの人が標準出力に印刷し、必要に応じて出力をファイルにリダイレクトできることを知っています。

convert2番目には、画像ファイルを変換して処理できるImageMagickがあります。コマンドラインから入出力ファイル名を取得します。ここでは、イメージファイルはパイプラインの一部としてほとんど使用されず、実際にはJPEGまたはPNGを端末にダンプしたくないので、ここではそうすることが合理的です。

-ファイル名引数を使用するときにそれを記録する場合は、stdinまたはstdoutを使用することをお勧めします。これは非常に一般的な習慣であり、ユーザーが同様のものを使用する必要はありません/dev/stdin。 (一部のシステムでは失敗する可能性があります。)

他の道具がすることをすることは驚きの余地を残さないので良いです。もちろん、ユースケースが十分に異なるため、他のユースケースをコピーする必要がない場合は除外されます。

関連情報