1

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

4

5 回答 5

4

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

#!/bin/sh -e

或者

set -e

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

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

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

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

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

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

set -o pipefail 1
于 2009-11-13T11:27:47.343 回答
1

上次运行命令的返回值存储在变量 中$?。您可以使用它来确定接下来要运行的命令。特殊变量概述。

于 2009-11-13T11:25:00.657 回答
1

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

if [[ -z $? ]]
then
  # notify me
  ssh example.com 'php /path/tasks/build.php'
fi
于 2009-11-13T11:26:07.973 回答
0

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


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

于 2009-11-13T11:28:07.873 回答