ファイルでdos2unixを実行すると、次のように端末に出力されます
dos2unix: converting file <filename> to UNIX format ...
出力を /dev/null に送信して出力を抑制しようとしたときに、これが予想どおり stdout ではなく stderr で送信されることに気付きました (エラーではなく通常のメッセージのように見えるため)。これには理由がありますか?
Unix ライクな環境では、プロセスをチェーンするのが一般的です。あるプログラムの結果は、別のプログラムの入力として使用されます。結果を診断と混合すると、次の処理段階で混乱が生じる可能性があります。また、次のプログラムにパイプされた処理結果が表示されない端末を見ている潜在的なユーザーから診断を隠すことにもなります。
これが、標準出力と標準エラー出力で結果と診断を分離する理由です。診断はエラーに限定されませんが、後続のプログラムが期待する処理結果ではないすべてを含む必要があります。
実際の質問に関して: dos2unix はファイルをその場で変換するためによく使用されますが、stdout に出力することもできます (ファイル名なしで呼び出すと、stdin から読み取って stdout に出力します)。その後、stdout は stderr から独立してリダイレクトできます。を検討してくださいcat blados | dos2unix > blaunix
。診断は引き続き表示されますが (エラー メッセージが含まれている場合があります)、処理の結果は blaunix に送信されます。
成功した場合に診断結果を出力することは、それほど一般的ではありません。おそらく、DOS ユーザーには少しうなずきます。処理結果に情報メッセージが含まれていたら、かなりまずいでしょう。たとえば、C ファイルが破損します。
理由はありませんが、通常stderr
はエラー出力だけではありません。これは、ロギングまたは情報メッセージによく使用される別のストリームです。ログ メッセージは出力stdout
されないため、プログラムの結果である には送信されません。
端末に表示される理由はシェルの結果であり、アプリケーションによって実際に制御されるわけではありません。
Try dos2unix -q <filename>
-q, --quiet 静かなモード。すべての警告とメッセージを抑制します。戻り値はゼロです。間違ったコマンドライン オプションが使用された場合を除きます。
それが実装された方法だからです...
ソースコードをチェックアウトすると、次のように表示されます。
...
if (!pFlag->Quiet)
fprintf(stderr, _("dos2unix: converting file %s to file %s in UNIX format ...\n"), argv[ArgIdx-1], argv[ArgIdx]);
...