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