如何使用退出代码顺序运行shell脚本?

时间:2009-11-13 11:20:46

标签: linux build integration scripting continuous

由于巡航控制充满了我整个星期都浪费的错误,我已经确定我现有的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“失败”,command2将不会运行,但我如何观察“失败/成功”退出代码以进行调试。我自己编写的一些脚本,我相信我需要做一些特别的事情。

5 个答案:

答案 0 :(得分:4)

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

#!/bin/sh -e

set -e

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

          -e      Exit  immediately if a simple command (see SHELL GRAMMAR
                  above) exits with a non-zero status.  The shell does not
                  exit  if  the  command that fails is part of an until or
                  while loop, part of an if statement, part of a && or  ||
                  list, or if the command's return value is being inverted
                  via !.  A trap on ERR, if set, is  executed  before  the
                  shell exits.

答案 1 :(得分:2)

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

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

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

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

set -o pipefail 1

答案 2 :(得分:1)

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

答案 3 :(得分:1)

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

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

答案 4 :(得分:0)

我建议你可以在预期失败的地方使用非零出口,在进一步处理之前你会检查 如果[$? -neq 0] 那就是失败。


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