I have 2 shell scripts.
The second shell script contains following functions second.sh
func1
func2
The first.sh will call the second shell script with some parameters and will call func1 and func2 with some other parameters specific to that function.
Here is the example of what I am talking about
second.sh
val1=`echo $1`
val2=`echo $2`
function func1 {
fun=`echo $1`
book=`echo $2`
}
function func2 {
fun2=`echo $1`
book2=`echo $2`
}
first.sh
second.sh cricket football
func1 love horror
func2 ball mystery
How can I achieve it?
You can't directly call a function in another shell script.
You can move your function definitions into a separate file and then load them into your script using the
.
command, like this:This will interpret
functions.sh
as if it's content were actually present in your file at this point. This is a common mechanism for implementing shared libraries of shell functions.The problem
The currenly accepted answer works only under important condition. Given
/foo/bar/first.sh
and
/foo/bar/second.sh
this works only if the
first.sh
is executed from within the same directory where thefirst.sh
is located. Ie. if the current working path of shell is/foo
, the attempt to run commandprints error:
That's because the
source ./second.sh
is relative to current working path, not the path of the script. Hence one solution might be to utilize subshell and runMore generic solution
Given
/foo/bar/first.sh
and
/foo/bar/second.sh
then
prints
How it works
$0
returns relative or absolute path to the executed scriptdirname
returns relative path to directory, where the $0 script exists$( dirname "$0" )
thedirname "$0"
command returns relative path to directory of executed script, which is then used as argument forsource
command/second.sh
just appends the name of imported shell scriptsource
loads content of specified file into current shellIf you define
in file1(chmod 750 file1) and file2
and run ./file2 you'll get Fun1 from file1 Hello Fun1 from file2 Hello Surprise!!! You overwrite fun1 in file1 with fun1 from file2... So as not to do so you must
it's save your previous definition for fun1 and restore it with the previous name deleting not needed imported one. Every time you import functions from another file you may remember two aspects:
Refactor your
second.sh
script like this:And then call these functions from script
first.sh
like this:OUTPUT: