My bash script uses a lot of checks like:
if [ something bad ] ; then
echo "error message"
exit 1
fi
I have found out that if the user executes it via source my-script.sh
rather than ./my-script.sh
, this exit 1
closes the user's shell ! And the user sees no error message !
How do I know that the script is sourced, and how do I exit (with non-zero status code) the sourced script? In general, what can I do about this?
It seems there could be 2 parts to this. The first is to know when you're executing in a source
d script instead of an executed one. That can be found in this answer, and for bash they suggest:
[[ "$0" != "$BASH_SOURCE" ]] && sourced=1 || sourced=0
to tell whether or not you are being sourced.
If you are being sourced, you'd want to use return
instead of exit
.
You could store that function in a variable with something like
if [[ $sourced -eq 1 ]]; then
ret=return
else
ret=exit
fi
and then when you want to use the appropriate one you'd just use
$ret 1
Define:
[[ "$0" == "$BASH_SOURCE" ]] && ret=exit || ret=return
Use:
$ret 1
For those who prefer if
:
# find out how the script was invoked
# we don't want to end the user's terminal session!
if [[ "$0" != "$BASH_SOURCE" ]] ; then
# this script is executed via `source`!
# An `exit` will close the user's console!
EXIT=return
else
# this script is not `source`-d, it's safe to exit via `exit`
EXIT=exit
fi
and then
$EXIT 1
The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.