1

次の単純なシェルスクリプトがあります。

#   get all servers from config
sshservers=`node $scriptDir/readconfig.js --command cluster.sshservers`

#for each server
for server in sshservers
do

    #run deployserver with server (server:port format) argument
    if ! sh deployserver --server $server
    then
        exit 1 #failure
    fi

done

現在、sshservers を取得する node コマンドは、ゼロ以外の終了コードを返す場合があります。これが起こると、事態はひどく悪くなったので、エラーメッセージで終了したいと思います.

どうすればいいですか?これが最も適切な方法でしょうか?

sshservers=`node $scriptDir/readconfig.js --command cluster.sshservers`
if ! $?
then
    echo "Error: node readconfig tool failed."
    exit 1
fi

また、物事がひどくうまくいかない場合、このノード コマンドの stderr をどのように出力すればよいでしょうか?

最後に、sh deployserver が適切に失敗したときに終了する方法はありますか、それとも別の方法で行う必要がありますか?

4

4 に答える 4

2

最後のコマンドが成功したかどうかを確認するには、次のようにします。

if [ "$?" != "0" ]
    then
        //do something
    fi

stderrは、スクリプトを単独で実行しているコンソールへの道を見つける必要があります。

于 2012-05-16T16:55:28.497 に答える
2

少し奇妙に見えますが、次のことは合法です。

sshservers=$( node ... ) || exit 1

node コマンドは、終了する前に有用なエラー診断を出力する必要があるため、エラー メッセージを出力する必要がないことに注意してください。スクリプトの先頭に単純に追加することもできset -eます。これにより、このフォームの割り当てが終了した場合にスクリプトが中止されます。割り当ての戻り値は「内部」コマンドの戻り値であるため、通常の手法がすべて適用されます。

于 2012-05-16T17:19:48.100 に答える
1

if割り当てをステートメントに入れることもできます。

if ! sshservers=$(node $scriptDir/readconfig.js --command cluster.sshservers)
then
  echo "oops, node command returned non-zero"
  exit 1
fi

for server in $sshservers; do ...
于 2012-05-16T17:22:20.217 に答える
1

$?最後の実行コマンドからの終了コードを含むを使用します。したがって、次のことができます。

sshservers=`node $scriptDir/readconfig.js --command cluster.sshservers`
[[ "$?" == "0" ]] || exit 1

あなたが抜け出すsh deployserver方法は、私がする方法です。必要に応じて使用できますが$?、使用方法は短くてクリーンな私見です。

于 2012-05-16T16:56:22.117 に答える