为什么 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,则解析输出将变得越来越困难。

如果stdout被重定向或过滤,stderr 仍然保持打印到终端。

根据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”写入标准错误作为其根目录。实现可以写入其他字母字符来指示文件的其他用途。

  • 当。。。的时候-u指定选项时,指示文件用途的字符后面应紧跟用户名(放在括号中),对应于进程的真实用户 ID。如果无法从进程的真实用户ID解析出用户名,则应写入进程的真实用户ID而不是用户名。

当标准输出和标准错误定向到同一文件时,输出应交错,以便文件名出现在每行的开头,后面跟着进程 ID 和指示文件用途的字符。那么,如果-u指定选项后,应写入使用该文件的每个进程的用户名或用户 ID。

对于每个文件操作数,应在上述最后一个输出之后将A<newline>写入标准错误。

参考

IEEE 标准 1003.1,2004 年版

答案2

这是故意的。

fuser将“原始”格式输出到 stdout,其中仅包含进程 ID 和它们之间的空格分隔符。这种格式的目的是方便管道到另一个进程或使用sed等进行操作...除此之外,它还输出供人类使用的额外信息到 stderr,与 stdout 输出交错和同步。这包括进程对文件的使用类型和其他信息。这个想法是,这个“额外”信息不需要发送到您通过管道输出的任何内容fuser,并且通过将其发送到 stderr,这就是默认情况下发生的情况。

相关内容