代码之家  ›  专栏  ›  技术社区  ›  Keet

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

  •  4
  • Keet  · 技术社区  · 15 年前

    我想通过日志程序重定向bash脚本的输出。具体来说,Apache的logrotate实用程序。重定向需要在脚本本身内设置。

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

    下面是脚本内部的一些伪代码,用于完成输出重定向,但这不起作用:

    exec >(logrotate -l $LOGFILE.log.%F 86400) 2>&1
    
    4 回复  |  直到 15 年前
        1
  •  4
  •   Roman Cheplyaka    15 年前

    您可以使用命名管道来实现这一点。

    PIPE=/var/run/myscript/pipe
    mkfifo "$PIPE"
    logrotate -l "$LOGFILE.%F" 86400 < "$PIPE" &
    exec > "$PIPE"
    

    另外,关于您的2>&1重定向--确保您理解它的应用。在第一个示例中,它应用于logrotate,而在第二个“示例”中,它将应用于脚本。

        2
  •  3
  •   MarcH rhardih    15 年前

    这就是你想要的:

    exec  >  >(logrotate -l $LOGFILE.log.%F 86400)
    

    请注意,过程替代不是标准的。回退被命名为管道。

        3
  •  0
  •   zigdon    15 年前

    我不认为剧本 重定向它自己的输出。你能为它写一个包装器脚本吗?

    我的脚本:

    myscript.real "$@" | logrotate -l $LOGFILE.%F 86400 2>&1
    
        4
  •  0
  •   Jonathan Leffler    15 年前

    执行此操作的经典方法(从Unix第7版开始在Bourne shell中)是:

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

    如果您也想重定向错误,那么:

    {
    ...body of script here...
    } 2>&1 | logrotate ...
    

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