我的用户没有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,然后使用>&2
redirect到STDERR。 我试图使用script
实用程序(其中redirect到/dev/stderr
正常工作),但它同时合并STDOUT和STDERR。
您可以使用Bash进程替换:
./utility --log-file=>(cat>&2)
替换将会出现在可以打开的工具--log-file=/dev/fd/63
。 cat
进程不需要打开就可以继承fd 2,所以可以进行转发。
我使用chmod -w /dev/stderr
和dd 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