Search code examples
evalshexitxcodebuild

Get exit code for eval command in sh


I'm trying to create a function in a shell script that takes a command and executes it using eval, and then does some post-processing based on the success of the command. Unfortunately the code is not behaving as I would expect. Here's what I have:

#!/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"

When the command ($cmd) succeeds, it works fine. When the command fails ( compilation error, for instance ), the script automatically exits before I can process the failure. Is there a way I can prevent eval from exiting, or is there a different approach I can take that will allow me achieve my desired behavior?


Solution

  • The script should only exit if you have set -e somewhere in the script, so I'll assume that is the case. A simpler way to write the function which will prevent set -e from triggering an automatic exit is to do:

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

    Note that function is non-portable when defining the function, and redundant if () are also used.