Petike
Petike

Reputation: 727

Unix - how to source multiple shell scripts in a directory?

when I want to execute some shell script in Unix (and let's say that I am in the directory where the script is), I just type:

./someShellScript.sh

and when I want to "source" it (e.g. run it in the current shell, NOT in a new shell), I just type the same command just with the "." (or with the "source" command equivalent) before it:

. ./someShellScript.sh


And now the tricky part. When I want to execute "multiple" shell scripts (let's say all the files with .sh suffix) in the current directory, I type:

find . -type f -name *.sh -exec {} \;

but "what command should I use to "SOURCE" multiple shell scripts in a directory"?
I tried this so far but it DIDN'T work:

find . -type f -name *.sh -exec . {} \;

and it only threw this error:

find: `.': Permission denied


Thanks.

Upvotes: 3

Views: 6104

Answers (3)

AmitP
AmitP

Reputation: 5473

You can use find and xargs to do this:

find . -type f -name "*.sh" | xargs -I sh {}

Upvotes: 0

sargas
sargas

Reputation: 1144

Try the following version of Jonathan's code:

export IFSbak = $IFS;export IFS="\0"
for file in `find . -type f -name '*.sh' -print0`
do source "$file"
end
export IFS=$IFSbak

The problem lies in the way shell's work, and that '.' itself is not a command (neither is source in this). When you run find, the shell will fork itself and then turn into the find process, meaning that any environment variables or other environmental stuff goes into the find process (or, more likely, find forks itself for new processes for each exec).

Also, note that your command (and Jonathan's) will not work if there are spaces in the file names.

Upvotes: 0

Jonathan Leffler
Jonathan Leffler

Reputation: 753455

for file in *.sh
do . $file
done

Upvotes: 13

Related Questions