web-dev-qa-db-ja.com

フューザーがSTDERRを使用するのはなぜですか?

SERVER:~ # fuser -uc /var/log
/var/log:             6824(daemon)  9902(root) 14011(root) 14084(root) 14208(lp)
SERVER:~ # fuser -uc /var/log 2>/dev/null
  6824  9902 14011 14084 14208SERVER:~ # 
SERVER:~ # 

質問:それは歴史的な理由によるものですか、それとも技術的な理由によるものですか?

fuserユーティリティは、次のような標準に拘束されています。

これが診断情報をstderrに出力する理由。これには、エラーだけでなく、ユーティリティのプライマリデータ出力ではないものも含まれます。
これは有用なデータですが、stdoutに含まれていると、出力の解析がますます困難になります。

stdoutがリダイレクトまたはフィルタリングされている場合でも、stderrは端末への印刷を続行します。

IEEE Std 1003.1、2004 Edition によると、fuserユーティリティ:

The *fuser* utility shall write to standard error additional information about the  
named  files indicating how the file is being used.   

[〜#〜] stderr [〜#〜]

fuserユーティリティは、診断メッセージを標準エラーに書き込みます。 fuserユーティリティも、標準エラーに次のように書き込みます。

  • 名前付き各ファイルのパス名が書き込まれ、直後にコロンが続きます。

  • 標準出力に書き込まれるプロセスIDごとに、プロセスがファイルを現在のディレクトリとして使用している場合は文字「c」が標準エラーに書き込まれ、プロセスがファイルを使用している場合は文字「r」が標準エラーに書き込まれます。そのルートディレクトリとして。実装は、ファイルの他の使用法を示すために他のアルファベット文字を書き込む場合があります。

  • -uオプションが指定されている場合、ファイルの使用を示す文字の直後に、プロセスに対応する括弧内のユーザー名が続くものとします。実際のユーザーID。プロセスの実ユーザーIDからユーザー名を解決できない場合は、ユーザー名の代わりにプロセスの実ユーザーIDを書き込む必要があります。

標準出力と標準エラーが同じファイルに送信される場合、ファイル名が各行の先頭に表示され、その後にプロセスIDとファイルの使用を示す文字が表示されるように、出力がインターリーブされます。次に、-uオプションが指定されている場合、そのファイルを使用する各プロセスのユーザー名またはユーザーIDが書き込まれます。

A <newline>は、各ファイルオペランドについて、上記の最後の出力の後に標準エラーに書き込まれます。

参照

IEEE Std 1003.1、2004 Edition

4
geedoubleya

意図的なものです。

fuserは、プロセスIDとその間のスペース区切り文字のみを含む「raw」形式をstdoutに出力します。この形式は、別のプロセスにパイプしたり、sedなどで操作したりするのに便利なことを目的としています。これに加えて、人間向けの追加情報をstderrに出力し、stdout出力とインターリーブおよび同期します。これには、プロセスがファイルやその他の情報を使用するタイプが含まれます。この「余分な」情報は、fuserの出力をパイプで送信するものに移動する必要はなく、stderrに送信することで、デフォルトで実行されるという考え方です。

2
Celada