由于巡航控制充满了我整个星期都浪费的错误,我已经确定我现有的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将不会运行,但我如何观察“失败/成功”退出代码以进行调试。我自己编写的一些脚本,我相信我需要做一些特别的事情。
答案 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] 那就是失败。
$?如果最后一个进程未成功执行,将始终返回非零数字。