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全体的な負担が加重されます。

おすすめ記事