- 
                Notifications
    
You must be signed in to change notification settings  - Fork 1.9k
 
SC2251
        Eisuke Kawashima edited this page Jul 29, 2025 
        ·
        12 revisions
      
    set -e
! false
restset -e
! false || exit 1ShellCheck has found a command inverted with ! that may have no effect. In particular, it does not appear as a condition in an if statement or while loop, or as the final command in a script or function.
The most common reason for this is thinking that it'll trigger set -e aka errexit if a command succeeds, as in the example. This is not the case: ! will inhibit errexit both on success and failure of the inverted command.
Adding || exit  will instead exit with failure when the command succeeds.
ShellCheck will not detect cases where $? is implicitly or explicitly used to check the value afterwards:
set -e
check_success() { [ $? -eq 0 ] || exit 1; }
! false; check_success
! true; check_successIn this case, you can ignore the warning.