How to exit if a command failed?

后端 未结 8 1434
猫巷女王i
猫巷女王i 2020-11-28 01:18

I am a noob in shell-scripting. I want to print a message and exit my script if a command fails. I\'ve tried:

my_command && (echo \'my_command failed         


        
相关标签:
8条回答
  • 2020-11-28 01:41

    Try:

    my_command || { echo 'my_command failed' ; exit 1; }
    

    Four changes:

    • Change && to ||
    • Use { } in place of ( )
    • Introduce ; after exit and
    • spaces after { and before }

    Since you want to print the message and exit only when the command fails ( exits with non-zero value) you need a || not an &&.

    cmd1 && cmd2
    

    will run cmd2 when cmd1 succeeds(exit value 0). Where as

    cmd1 || cmd2
    

    will run cmd2 when cmd1 fails(exit value non-zero).

    Using ( ) makes the command inside them run in a sub-shell and calling a exit from there causes you to exit the sub-shell and not your original shell, hence execution continues in your original shell.

    To overcome this use { }

    The last two changes are required by bash.

    0 讨论(0)
  • 2020-11-28 01:46

    You can also use, if you want to preserve exit error status, and have a readable file with one command per line:

    my_command1 || exit $?
    my_command2 || exit $?
    

    This, however will not print any additional error message. But in some cases, the error will be printed by the failed command anyway.

    0 讨论(0)
  • 2020-11-28 01:47

    I've hacked up the following idiom:

    echo "Generating from IDL..."
    idlj -fclient -td java/src echo.idl
    if [ $? -ne 0 ]; then { echo "Failed, aborting." ; exit 1; } fi
    
    echo "Compiling classes..."
    javac *java
    if [ $? -ne 0 ]; then { echo "Failed, aborting." ; exit 1; } fi
    
    echo "Done."
    

    Precede each command with an informative echo, and follow each command with that same
    if [ $? -ne 0 ];... line. (Of course, you can edit that error message if you want to.)

    0 讨论(0)
  • 2020-11-28 01:50

    Note also, each command's exit status is stored in the shell variable $?, which you can check immediately after running the command. A non-zero status indicates failure:

    my_command
    if [ $? -eq 0 ]
    then
        echo "it worked"
    else
        echo "it failed"
    fi
    
    0 讨论(0)
  • 2020-11-28 01:57

    The other answers have covered the direct question well, but you may also be interested in using set -e. With that, any command that fails (outside of specific contexts like if tests) will cause the script to abort. For certain scripts, it's very useful.

    0 讨论(0)
  • 2020-11-28 02:00

    If you want that behavior for all commands in your script, just add

      set -e 
      set -o pipefail
    

    at the beginning of the script. This pair of options tell the bash interpreter to exit whenever a command returns with a non-zero exit code.

    This does not allow you to print an exit message, though.

    0 讨论(0)
提交回复
热议问题