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.sh
for executado no mesmo diretório em que first.sh
está 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 source
comando
- em "second.sh",
/first.sh
apenas acrescenta o nome do script de shell importado
source
carrega o conteúdo do arquivo especificado no shell atual