我的用户没有 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
但是像通常的重定向
echo >&2
工作正常。
但是我现在需要处理一个只向指定文件提供日志输出的第 3 方二进制文件:
./utility --log-file=output.log
我想直接在 STDERR 中查看日志输出。
由于缺少写权限,我无法像 --log-file=/dev/stderr
这样简单的方法。在设置了写权限的其他系统上,这可以正常工作。
此外,我还需要将进程的输出解析到 STDOUT,因此我不能简单地将日志发送到 STDOUT,然后使用 >&2
重定向到 STDERR。我尝试使用 script
实用程序(其中重定向到 /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=>(cat>&2)
成功了。
请注意,您的错误输出可能会遭受比您必然想要/期望的更多的缓冲,并且不会与您的 shell 提示符同步。换句话说,您的提示可能与 utility
完成后到达终端的错误输出混合在一起。 dd
示例可能会证明这一点。 您可能需要在命令后附加 ;wait
以确保 cat
在您的 PS1
提示出现之前完成: ./utility --log-file=>(cat>&2);等待
关于linux - 即使用户不可写,也按文件名写入 STDERR,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36867851/