【问题标题】:Bash - prevent script to stop execution on errorBash - 防止脚本在错误时停止执行
【发布时间】:2014-11-29 04:55:57
【问题描述】:

我需要在目录中递归查找一种类型的文件。然后为找到的每个文件执行脚本,并以找到的文件作为参数:

#!/bin/bash
find /mnt/storage/content/www/html/smartsite/src/data/resource/ ! -path "*/tmp/*" -regextype posix-awk -iregex "(.*.toConv)" -exec /mnt/storage/content/www/html/smartsite/cron/VideoConvert/convert {} \;

它可以正常工作,但是当调用脚本(转换)抛出错误时执行会停止。我想阻止这种情况并继续执行找到的下一个文件。例如,无论我做什么

/convert || true {} \;

/convert {} || true \;

它总是抛出错误“没有执行参数”。我做错了什么?

【问题讨论】:

  • 出于好奇,您能否解释一下throws error 或提供脚本? find 的执行不应在 stderr 上停止,或者即使脚本返回错误退出代码(-exec 将变为 false,这将阻止 -exec 之后的表达式执行,并导致 find继续下一个文件。但由于在您的命令中-exec 之后没有表达式,这应该没关系)
  • “convert”脚本中有 ffmpeg 调用。如果 ffmpeg 失败, find 停止搜索。我想阻止这种情况并转到找到的下一个文件。所以我要么我需要确保“转换”脚本不会向 stderr 抛出任何错误,要么添加 || true 到 find/exec 传递“true”退出代码来查找,即使脚本失败

标签: bash error-handling find exec


【解决方案1】:

最直接的问题是解析顺序并没有像您想象的那样工作。命令:

find /.../resource/ ! -path "*/tmp/*" -regextype posix-awk -iregex "(.*.toConv)" -exec /.../convert || true {} \;

被shell解析成两个命令(以||分隔):

find /.../resource/ ! -path "*/tmp/*" -regextype posix-awk -iregex "(.*.toConv)" -exec /.../convert
true {} \;

...由于\; 是单独命令的一部分,find 永远不会看到它,并抱怨你没有给它一个完整的-exec 序列。您可以引用/转义 ||,使其作为 -exec 序列的一部分传递给 find,但这也不会满足您的要求,因为 -exec 只运行 单个命令,并将其作为参数传递给该命令,因此转换脚本将获得 ||true 作为参数...

为了做你想做的事,你实际上必须让-exec 运行另一个shell,并让那个子shell 运行转换脚本和true。这个是可以的,虽然有点乱,但是也解决不了实际的问题,因为实际的问题不是你想的那样。

正如@BroSlow 所说,find ... -exec 不会停止只是因为该命令返回了错误状态(或向 stderr 输出某些内容)。其他东西使find 停止,因此覆盖退出状态并不能解决问题。你需要找出实际的问题,然后攻击它。

【讨论】:

    【解决方案2】:

    这似乎没问题:

    convert {} \; || true
    

    【讨论】:

      【解决方案3】:

      试试这个

      find ... -exec bash -c "convert {} || true" ";"
      

      find ... -print0 | xargs -r -0 -i convert {}
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-11-07
        • 1970-01-01
        • 2010-09-19
        • 2011-07-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多