81
20
Consider the following code
outer-scope.sh
#!/bin/bash
set -e
source inner-scope.sh
echo $(inner)
echo "I thought I would've died :("
inner-scope.sh
#!/bin/bash
function inner() { echo "winner"; return 1; }
I'm trying to get outer-scope.sh
to exit when a call to inner()
fails. Since $()
invokes a sub-shell, this doesn't happen.
How else do I get the output of a function while preserving the fact that the function may exit with a non-zero exit code?
1Hmm, when I type
if ! $(exit 1) ; then echo $?; fi
, I get0
. Not sureif
is the way to go if you need to preserve that exit value. – Ron Burk – 2017-05-04T02:08:46.373@grawity - Does this work with Dash? I'm trying to work around some annoying Autoconf behavior (namely, Autoconf reporting success when Sun or IBM's compiler prints illegal option to the terminal). – jww – 2017-11-08T20:33:25.510
@jww It should be standard POSIX sh behavior. Are you sure the compiler actually returns a non-0 status when that happens? – user1686 – 2017-11-08T20:57:03.463
@grawity - Thanks. I'm not sure what the compiler is returning. Then again, Autoconf never states what the criteria for success is when using
– jww – 2017-11-08T21:01:48.157AC_COMPILE_IFELSE
. It may be as weak as an executable is produced. I'm trying to gather that information now at More robust AC_COMPILE_IFELSE feature testing?3
if ! output=$(inner); then exit $?; fi
will exit with a return code of 0 because$?
will give the return code of!
instead of the return code ofinner
. You could get the desired behavior withif output=$(inner); then : ; else exit $?; fi
but that's obviously more verbose – SJL – 2018-04-06T14:56:19.257Why is it that, even though $? contains the exit status of $() that the script does not exit automatically (given that -e is set)? EDIT: nevermind, I think you have answered my questions, thanks! – jabalsad – 2011-12-02T16:12:27.877
I'm not sure. (I haven't tested any of the above.) But there are some restrictions on -e, all explained in bash's manpage; also, if you are asking about
echo $()
, then it might be because the subshells' exit codes are ignored when the line - theecho
command - has an exit code (usually 0) of its own. – user1686 – 2011-12-02T18:10:55.670