如何通过一个进程重定向脚本的输出?

4
我希望能够通过一个日志程序重定向bash脚本的输出。具体来说,是通过Apache的logrotate实用工具进行操作。这个重定向需要在脚本内部设置。
如果在执行脚本时在命令行上进行重定向,它看起来会像这样:
myscript | logrotate -l $LOGFILE.%F 86400 2>&1

以下是伪代码,用于在脚本中实现输出重定向,但其并不起作用:

exec >(logrotate -l $LOGFILE.log.%F 86400) 2>&1
4个回答

4
今日免费次数已满, 请开通会员/明日再来
PIPE=/var/run/myscript/pipe
mkfifo "$PIPE"
logrotate -l "$LOGFILE.%F" 86400 < "$PIPE" &
exec > "$PIPE"

此外,关于你的2>&1重定向,请确保你了解它应用的对象。在你的第一个例子中,它应用于logrotate,而在第二个“例子”中,它将应用于你的脚本。

3
这是您想要的内容:
exec  >  >(logrotate -l $LOGFILE.log.%F 86400)

请参阅Bash手册中的“进程替换”部分。
请注意,进程替换不是标准功能。备选方案是命名管道。

0

这个经典的方法 - 自 Unix 7th Edition 起在 Bourne shell 中执行 - 是:

{
...body of script here...
} | logrotate ...

如果你想要重定向错误信息,那么:
{
...body of script here...
} 2>&1 | logrotate ...

这种表示法的唯一缺点是重定向开始和结束之间的分隔较宽(通常如此)。从这个角度来看,如果你确定在所有相关系统上都可以使用Bash,那么Bash进程替代可能更好。


0

我认为脚本无法重定向自己的输出。不过,你可以为它编写一个包装脚本,试试看吗?

我的脚本:

myscript.real "$@" | logrotate -l $LOGFILE.%F 86400 2>&1

1
使用"$@"代替$*来传递位置参数以获得正确的引用。 - Roman Cheplyaka
不,它应该用双引号括起来 - 就像我写的一样。没有引号的$@确实与没有引号的$*没有区别。 - Roman Cheplyaka
一个脚本或者一个 { } 块 可以 使用 exec >somefile 来重定向它自己的输出。但是 Joshua 的问题更难。 - MarcH

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接