【问题标题】:How can I use exit codes to run shell scripts sequentially?如何使用退出代码顺序运行 shell 脚本?
【发布时间】:2010-12-16 06:20:11
【问题描述】:

由于巡航控制充满了浪费了我整个星期的错误,我决定我现有的 shell 脚本更简单,因此更好。

这是我目前所拥有的

svn update /var/www/k12/
#svn log --revision "HEAD" /var/www/code/  | head -2 | tail -1 | awk '{print $1}' > /var/www/path/version.txt

# upload the files
rsync -ar --verbose --stats --progress --delete --exclude=*.svn /var/www/code/ example.com:/home/path

# bring database up to date
ssh example.com 'php /path/tasks/dbrefactor.php'

# notify me
ssh example.com 'php /path/tasks/build.php'

唯一的事情是前几天我更改了路径并忘记更新 rsync 调用。结果,“通知我”步骤在我解决问题时运行了好几次。

我知道在 linux 中您可以执行 command1 && command2 并且如果命令 1“失败”命令 2 将无法运行,但我如何观察“失败/成功”退出代码以进行调试。我自己编写的一些脚本,我确信我需要做一些特别的事情。

【问题讨论】:

    标签: linux build integration scripting continuous


    【解决方案1】:

    最好的选择,尤其是无人参与的脚本,是设置-e shell 选项:

    #!/bin/sh -e
    

    或

    set -e
    

    如果任何(未经测试的)命令以非零错误代码退出,这将导致 shell 停止执行。

    -e 如果一个简单的命令立即退出(见 SHELL GRAMMAR 以上)以非零状态退出。外壳不 如果失败的命令是直到的一部分,则退出或 while 循环,if 语句的一部分,&& 或 || 的一部分 列表,或者如果命令的返回值被反转 通过 !。如果设置了 ERR 陷阱,则会在 壳退出。

    【讨论】:

    • shell检测到的(非零)退出码将是shell返回时的返回值。所以你会在 shell 脚本退出后使用$?。
    【解决方案2】:

    前一个进程的退出代码恰好在其执行后位于$? 变量中。通常(这不是必需的,但这是每个人都遵循的约定)成功命令的退出代码将等于0,任何其他值都表示错误。

    记住警告!其中之一是在这些命令之后:

    svn log --revision "HEAD" /var/www/code/  | head -2 | tail -1 | awk '{print $1}'
    echo "$?"
    

    很可能会返回零结果,因为在$? 中包含返回代码awk。为避免这种情况,请在代码上方的某处设置pipefail 选项:

    set -o pipefail 1
    

    【讨论】:

    • 乔希,由于您的声望超过 15,您可能希望并且能够“投票”给您喜欢和/或发现有用的答案——试试大数字附近的按钮。
    【解决方案3】:

    上次运行命令的返回值存储在变量$?中。您可以使用它来确定接下来要运行的命令。 Overview of special variables.

    【讨论】:

      【解决方案4】:

      我认为 $?包含最后的退出代码

      if [[ -z $? ]]
      then
        # notify me
        ssh example.com 'php /path/tasks/build.php'
      fi
      

      【讨论】:

        【解决方案5】:

        我建议您可以在预期失败的点使用非零退出,在进一步处理步骤之前,您将检查 如果 [ $? -neq 0] 那么就失败了。


        $?如果最后一个进程没有成功执行,将始终返回一个非零数字。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2013-01-26
          • 1970-01-01
          • 1970-01-01
          • 2021-12-09
          • 2013-08-28
          • 2010-11-27
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多