fusionerがSTDERRを使用するのはなぜですか?

fusionerが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:~ # 

質問:歴史的な理由か技術的な理由なのか?

答え1

このfuserユーティリティには、次の標準が適用されます。

これの根拠は診断情報をに出力することですstderr。これには、エラーだけでなく、ユーティリティの基本データ出力ではないすべてのエントリが含まれます。これは有用なデータですが、
含まれている場合はstdout出力を解析することがますます困難になります。

リダイレクトまたはフィルタリングされている場合、stdoutstderrは引き続き端末に印刷します。

~によるとIEEE規格1003.1、2004年版fuserユーティリティ:

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

標準エラーエラー率

これフューザーユーティリティは標準エラーに診断メッセージを記録する必要があります。これフューザーまた、ユーティリティは標準エラーに以下を記録する必要があります。

  • 名前付き各ファイルのパス名の後にはコロンが続きます。

  • 標準出力に書き込むプロセスIDごとに、プロセスがファイルを現在のディレクトリとして使用している場合は文字「c」を標準エラーに書き込む必要があり、プロセスがファイルを使用している場合は標準エラーに文字「r」を書き込む必要があります。 。 file.standard エラーをルートディレクトリとして使用します。実装では、ファイルの異なる用途を表すために異なるアルファベット文字を書くことができます。

  • いつ。 。 。いつ- ゆうオプションを指定するとき、ファイルの目的を表す文字の直後には、プロセスの実際のユーザーIDに対応するユーザー名(括弧内)が続きます。プロセスの実際のユーザーIDでユーザー名を解決できない場合は、ユーザー名の代わりにプロセスの実際のユーザーIDを作成する必要があります。

標準出力と標準エラーが同じファイルに渡される場合は、ファイル名が各行の先頭に表示され、その後にプロセスIDとファイルの目的を表す文字が表示されるように出力をインターリーブする必要があります。だから- ゆうオプションを指定した場合は、そのファイルを使用する各プロセスのユーザー名またはユーザーIDを書き留める必要があります。

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

引用する

IEEE規格1003.1、2004年版

答え2

これは意図的なものです。

fuserプロセスIDとその間のスペース区切り文字のみを含む「raw」形式でstdoutとして出力します。この形式の目的は、他のプロセスへのパイプ接続やその他の作業sedなどを容易にすることです。何よりも、人が消費する追加情報をstderrに出力し、stdout出力とインターリーブして同期します。これには、プロセスのファイル使用タイプやその他の情報が含まれます。アイデアは、この「追加」情報をパイプに送信する宛先に送信する必要はなく、fuserこれをstderrに送信すると基本的にそのようなことが起こることです。

関連情報