[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
set -e not working as expected with conditional operators
From: |
rpaufin1 |
Subject: |
set -e not working as expected with conditional operators |
Date: |
Fri, 02 Jun 2023 01:01:08 +0000 |
Consider the following script:
#!/bin/bash
f() {
ls missing-file 2> /dev/null
echo "test"
}
# 1
(set -e; f); ret=$?
if (( ret )); then
echo "failed"
exit 1
fi
# 2
(set -e; f) || {
echo "failed"
exit 1
}
Running the block labelled '1' prints "failed" and returns 1 as the exit code,
while running the other block prints "test" and returns 0. However, the result
should be the same.
If f() is modified like so, however:
f() {
ls missing-file 2> /dev/null || return 1
echo "test"
}
then it "works", but this also works without using set -e.
I thought this was an issue with subshells, but apparently the following script
also doesn't work as expected:
#!/bin/bash
f() {
ls missing-file 2> /dev/null
echo "test"
}
set -e
f && :
Since f() is not ran in a subshell, the script should quit after the 'ls'
command because of set -e, but "test" is still printed and the script exits
with 0. To make this script work you can either remove the "&& :" part or the
'echo' command from f(), but again, it doesn't seem like it's supposed to work
this way.
# This works
f() {
ls missing-file 2> /dev/null
}
set -e
f && :
# This also works
f() {
ls missing-file 2> /dev/null
echo "test"
}
set -e
f
What's going on here? I'm using the latest release, Bash 5.2.15.
- set -e not working as expected with conditional operators,
rpaufin1 <=