Solution
#!/bin/bash -e
echo "before"
echo "anything" | grep e || : # it would if I searched for 'y' instead
echo "after"
exit
Explanation
set -e or set -o errexit
Exit immediately if a pipeline (which may consist of a single simple command), a list, or a compound command (see
SHELL GRAMMARabove), exits with a non-zero status. The shell does not exit if the command that fails is part of the command list immediately following awhileoruntilkeyword, part of the test following theiforelifreserved words, part of any command executed in a&&or||list except the command following the final&&or||, any command in a pipeline but the last, or if the command's return value is being inverted with!. If a compound command other than a subshell returns a non-zero status because a command failed while-ewas being ignored, the shell does not exit. A trap onERR, if set, is executed before the shell exits. This option applies to the shell environment and each sub‐ shell environment separately (seeCOMMAND EXECUTION ENVIRONMENTabove), and may cause subshells to exit before executing all the commands in the subshell.
Plus, : is the no-effect command in Bash.