Fascinating problem with bash
Hi folks,
on my Debian box I'm running GNU bash, version 3.2.39(1)-release (i486-pc-linux-gnu).
Now, today I ran across a slight problem that I fail to understand. I have one script that acts as a library of a kind. I.e. it is being sourced by other scripts and performs some actions upon startup.
I have the following three files for a minimal working example of the problem (I trimmed a lot of error/prerequisite handling):
* test.sh (requires chmod a+x test.sh)
* common-bash-routines.sh (in the same folder)
* etc/defaults
test.sh uses common-bash-routines.sh as a library and common-bash-routines.sh is supposed to inspect the variable SCRIPTCONF to find out whether it is set. If it is set there are two choices (inner while loop):
1.) it's a file, it means it will get sourced
2.) it's a directory
Both cases can occur in several places (outer while loop). Since the paths can contain blanks, I resorted to a "while read" loop because "for" simply would tokenize the file names more than desirable.
Now since I would like to know whether I have successfully sourced *something* I was going to set a variable (SOURCED in my case). However, this variable does not get set in the outer or the inner loop. Also, using "export" instead of the normal variable assignment makes no difference whatsoever. How can I carry the information as to whether I have sourced *something* outside of the loops?
Thanks for any helpful pointers or hints,
// Oliver
PS:
Code contents follow:
---------------------------------------
###############################################
## test.sh (uses the library)
###############################################
#!/usr/bin/env bash
SCRIPTCONF=$PWD/etc
for i in . ${PATH//:/ }; do [[ -e "$i/common-bash-routines.sh" ]] && \
source "$i/common-bash-routines.sh" && break; done
echo "Here is $BASH_SOURCE:$LINENO"
###############################################
## common-bash-routines.sh (this file is being sourced
###############################################
function errorexit()
{
[ -n "$1" ] && echo -e \
"\033[0;31mFATAL ERROR: $1 Can't continue!\033[0m\n"
local ERRCODE=254
[ -n "$2" ] && ERRCODE=$2
exit $ERRCODE
}
SOURCED=''
if [[ -n "$SCRIPTCONF" ]]; then # if set
echo -e "$SCRIPTCONF\n/etc/$SCRIPTCONF"|while read fname; do
[[ -n "$fname" ]] || continue
if [[ -f "$fname" ]]; then
source "$fname" || errorexit "Could not source ($fname)"
SOURCED="$SOURCED:$srcname"
elif [[ -d "$fname" ]]; then
find "$fname/" -type f|while read srcname; do
source "$srcname" || errorexit "Could not source ($srcname)"
SOURCED="$SOURCED:$srcname"
done
fi
done
echo "$SOURCED"
[[ -n "$SOURCED" ]] || errorexit "Could not *find* ($SCRIPTCONF).";
fi
###############################################
## etc/defaults
###############################################
# etc/defaults
echo "Here is $BASH_SOURCE"
---------------------------------------
(end of source snippets)
--
---------------------------------------------------
DDKWizard and DDKBUILD: <http://ddkwizard.assarbad.net>
Trunk (potentially unstable) version: <http://ddkwizard.assarbad.net/trunk/ddkbuild.cmd>
Reply to: