11

コマンドを受け取り、evalを使用して実行し、コマンドの成功に基づいて後処理を行うシェルスクリプトで関数を作成しようとしています。残念ながら、コードは私が期待するように動作していません。これが私が持っているものです:

#!/bin/sh

...

function run_cmd()
{
        # $1 = build cmd

        typeset cmd="$1"
        typeset ret_code

        eval $cmd
        ret_code=$?

        if [ $ret_code == 0 ]
        then
                # Process Success
        else
                # Process Failure
        fi

}

run_cmd "xcodebuild -target \"blah\" -configuration Debug"

コマンド($cmd)が成功すると、正常に機能します。コマンドが失敗すると(たとえば、コンパイルエラー)、失敗を処理する前にスクリプトが自動的に終了します。evalが終了するのを防ぐ方法はありますか、それとも、希望する動作を実現できる別のアプローチがありますか?

4

1 に答える 1

19

set -eスクリプトは、スクリプトのどこかにある場合にのみ終了する必要があるため、その場合と想定します。set -e自動終了のトリガーを防ぐ関数を作成する簡単な方法は、次のことです。

run_cmd() {
        if eval "$@"; then
                # Process Success
        else
                # Process Failure
        fi
}

function関数を定義するときは移植性がなく、使用されている場合は冗長であることに注意してください()

于 2013-01-17T22:56:05.153 に答える