I am essentially trying to implement a function which asserts the failure (non-zero exit code) of another command, and prints a message when it fails.

Here is my function:

function assert_fail () {
    COMMAND=$@
    if [ `$COMMAND; echo $?` -ne 0 ]; then 
        echo "$COMMAND failed as expected."
    else
        echo "$COMMAND didn't fail"
    fi
}

# This works as expected
assert_fail rm nonexistent

# This works too
assert_fail rm nonexistent nonexistent2

# This one doesn't work
assert_fail rm -f nonexixtent

As soon as I add options to the command, it doesn't work. Here is the output of the above:

rm: cannot remove `nonexistent': No such file or directory
rm nonexistent failed as expected.
rm: cannot remove `nonexistent': No such file or directory
rm: cannot remove `nonexistent2': No such file or directory
rm nonexistent nonexistent2 failed as expected.
rm -f nonexistent didn't fail

I have tried putting double quotes around the commands, to no avail. I would expect the third invocation in the above to produce similar output to the other two.

I appreciate any/all help!

Edit
Report