1

クルーズ コントロールはバグだらけで 1 週間を無駄にしてしまったので、既存のシェル スクリプトの方がシンプルで優れていると判断しました。

これが私がこれまでに持っているものです

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 呼び出しを更新するのを忘れたことです。その結果、私が物事を考えている間に「通知する」ステップが数回実行されました。

command1 && command2コマンド1が「失敗」した場合、コマンド2は実行されませんが、デバッグ目的で「失敗/成功」終了コードを確認するにはどうすればよいですか。私が自分で書いたスクリプトのいくつかは、何か特別なことをする必要があると確信しています。

4

5 に答える 5

4

特に無人スクリプトの場合、最適なオプションは、-eシェル オプションを設定することです。

#!/bin/sh -e

また

set -e

これにより、(テストされていない) コマンドがゼロ以外のエラー コードで終了した場合、シェルは実行を停止します。

          -e 単純なコマンドの場合はすぐに終了します (SHELL GRAMMAR を参照)
                  上記) ゼロ以外のステータスで終了します。シェルはしません
                  失敗したコマンドが until またはの一部である場合は終了します
                  while ループ、if 文の一部、&& または || の一部
                  リスト、またはコマンドの戻り値が反転されている場合
                  経由 !。ERR のトラップが設定されている場合、エラーの前に実行されます。
                  シェルが終了します。
于 2009-11-13T11:27:44.923 に答える
2

$?前のプロセスの終了コードは、その実行直後にたまたま変数に含まれています。通常 (これは必須ではありませんが、誰もが従う規則です) 成功したコマンドの終了コードは に等しくなり0、それ以外の値はエラーを意味します。

注意事項を覚えておきましょう!それらの1つは、これらのコマンドの後です:

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

戻りコードにが含まれて$?いるため、ゼロの結果が返される可能性が高くなります。これを回避するには、コードの上のどこかにオプションを設定します。awkpipefail

set -o pipefail 1
于 2009-11-13T11:27:47.343 に答える
1

私は$だと思いますか?最後の終了コードが含まれています

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

最後に実行されたコマンドの戻り値は、変数に格納されます$?。これを使用して、次に実行するコマンドを決定できます。特殊変数の概要。

于 2009-11-13T11:25:00.657 に答える
0

失敗が予想されるポイントでゼロ以外の出口を使用することをお勧めします。さらにステップを処理する前に、[ $? -neq 0 ] の場合、障害があります。


$? 最後のプロセスが正常に実行されなかった場合、常にゼロ以外の数値を返します。

于 2009-11-13T11:28:07.873 に答える