即使对于用户不可写,也可以通过文件名写入STDERR

我的用户没有STDERR的写入权限:

user@host:~> readlink -e /dev/stderr /dev/pts/19 user@host:~> ls -l /dev/pts/19 crw--w---- 1 sysuser tty 136, 19 Apr 26 14:02 /dev/pts/19 

这通常不是一个大问题,

 echo > /dev/stderr 

失败

 -bash: /dev/stderr: Permission denied 

但通常redirect一样

 echo >&2 

工作正常。

不过,我现在需要应付只提供日志输出到指定文件的第三方二进制文件:

 ./utility --log-file=output.log 

我想直接在STDERR中看到日志输出。

我不能像--log-file=/dev/stderr这样简单的方法来完成,因为缺less写权限。 在其他设置了写入权限的系统上,这种方式可以正常工作。

另外,我还需要将进程的输出parsing为STDOUT,因此我不能简单地将日志发送到STDOUT,然后使用>&2redirect到STDERR。 我试图使用script实用程序(其中redirect到/dev/stderr正常工作),但它同时合并STDOUT和STDERR。

您可以使用Bash进程替换:

 ./utility --log-file=>(cat>&2) 

替换将会出现在可以打开的工具--log-file=/dev/fd/63cat进程不需要打开就可以继承fd 2,所以可以进行转发。

我使用chmod -w /dev/stderrdd if=/etc/issue of=/dev/stderr测试了上面的内容, dd if=/etc/issue of=/dev/stderr 。 这失败了,但改为dd if=/etc/issue of=>(cat>&2)成功。

请注意,您的错误输出可能会受到比您想要的更多的缓冲,并且不会与您的shell提示符同步。 换句话说,您的提示可能会出现混合错误输出,在utility完成后到达您的终端。 dd例子可能会证明这一点。 您可能需要追加;wait命令后,确保在您的PS1提示符出现之前cat已经完成: ./utility --log-file=>(cat>&2); wait ./utility --log-file=>(cat>&2); wait