gpt4 book ai didi

linux - 即使用户不可写,也按文件名写入 STDERR

转载 作者:太空狗 更新时间:2023-10-29 12:01:00 26 4
gpt4 key购买 nike

我的用户没有 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/stderrdd 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/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com