O problema
A resposta atualmente aceita funciona apenas em condições importantes. Dado...
/foo/bar/first.sh:
function func1 {
echo "Hello $1"
}
e
/foo/bar/second.sh:
#!/bin/bash
source ./first.sh
func1 World
isso funciona apenas se o first.shfor executado no mesmo diretório em que first.shestá localizado. Ie. se o caminho de trabalho atual do shell for /foo, a tentativa de executar o comando
cd /foo
./bar/second.sh
imprime erro:
/foo/bar/second.sh: line 4: func1: command not found
Isso porque source ./first.shé relativo ao caminho de trabalho atual, não ao caminho do script. Portanto, uma solução pode ser utilizar subshell e executar
(cd /foo/bar; ./second.sh)
Solução mais genérica
Dado...
/foo/bar/first.sh:
function func1 {
echo "Hello $1"
}
e
/foo/bar/second.sh:
#!/bin/bash
source $(dirname "$0")/first.sh
func1 World
então
cd /foo
./bar/second.sh
estampas
Hello World
Como funciona
$0 retorna o caminho relativo ou absoluto para o script executado
dirname retorna o caminho relativo para o diretório, onde existe o script $ 0
$( dirname "$0" )o dirname "$0"comando retorna o caminho relativo para o diretório do script executado, que é então usado como argumento para o sourcecomando
- em "second.sh",
/first.shapenas acrescenta o nome do script de shell importado
source carrega o conteúdo do arquivo especificado no shell atual