Bash脚本使用“OR”运算符

时间:2014-01-31 18:16:12

标签: apache bash operators logrotate

apache的默认logrotate脚本是:

/var/log/httpd/*log {
    missingok
    notifempty
    sharedscripts
    postrotate
        /sbin/service httpd reload > /dev/null 2>/dev/null || true
    endscript
}

我理解第6行的输出和错误重定向,但有人可以解释|| true的目的吗?省略那一点有什么潜在的后果?

1 个答案:

答案 0 :(得分:3)

logrotate实用程序运行postrotate(或prerotate)脚本时,它会检查脚本返回的错误代码。特别是,当指定sharedscripts时,错误处理如下(引自man logrotate,强调添加):

  

sharedscripts

     
    

通常,为每个旋转的日志运行prerotate和postrotate脚本,并将日志文件的绝对路径作为第一个参数传递给脚本。这意味着对于匹配多个文件的日志文件条目(例如/ var / log / news / *示例),可以多次运行单个脚本。如果指定了sharedscripts,则无论与通配符模式匹配多少个日志,脚本都只运行一次,并将整个模式传递给它们。但是,如果模式中的所有日志都不需要旋转,则根本不会运行脚本。 如果脚本退出时出现错误,则不会对任何日志执行其余操作。此选项会覆盖nosharedscripts选项并隐含create选项。

  

|| true阻止http reload命令返回错误条件,这可以避免上述情况。

man bash(在“列表”部分中)描述了||

  

command1 || command2

     
    当且仅当command2返回非零退出状态时,才执行

command1。 AND和OR列表的返回状态是列表中执行的最后一个命令的退出状态。

  

man true详细解释了true,但我认为标题就足够了:“什么也不做,成功”。

简而言之,command1 || true首先执行command1。如果成功,结果就是成功。否则,它执行true,什么都不成功,因此成功。因此它始终执行command1并始终成功