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

标签 linux bash

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

相关文章:

Bash 获取命令的返回值并以此值退出

linux - 在 Linux 中更改默认 shell

bash - 多次通过 stdin 将参数传递给 shell 脚本

linux - 如何查找特定文件类型并对其进行压缩?

c - Vala:使用库不起作用:找不到 taglib、tag_c.h

php - 如何修复 Linux 主机中 codeigniter 中显示的 404 Page Not Found?

bash - 使用命令行将所有空文件复制到文件夹中

python - python脚本的shell启动/停止

python - 在Linux中使用Python正确读取换行符

windows - Atom 的命令行打开触发 Windows 命令提示符