The problem
The currenly accepted answer works only under important condition. Given...
/foo/bar/first.sh:
function func1 {
echo "Hello $1"
}
and
/foo/bar/second.sh:
#!/bin/bash
source ./first.sh
func1 World
this works only if the first.sh is executed from within the same directory where the first.sh is located. Ie. if the current working path of shell is /foo, the attempt to run command
cd /foo
./bar/second.sh
prints error:
/foo/bar/second.sh: line 4: func1: command not found
That's because the source ./first.sh is relative to current working path, not the path of the script. Hence one solution might be to utilize subshell and run
(cd /foo/bar; ./second.sh)
More generic solution
Given...
/foo/bar/first.sh:
function func1 {
echo "Hello $1"
}
and
/foo/bar/second.sh:
#!/bin/bash
source $(dirname "$0")/first.sh
func1 World
then
cd /foo
./bar/second.sh
prints
Hello World
How it works
$0 returns relative or absolute path to the executed script
dirname returns relative path to directory, where the $0 script exists
$( dirname "$0" ) the dirname "$0" command returns relative
path to directory of executed script, which is then used as argument for source command
- in "second.sh",
/first.sh just appends the name of imported shell script
source loads content of specified file into current
shell