Il problema
La risposta attualmente accettata funziona solo in condizioni importanti. Dato...
/foo/bar/first.sh:
function func1 {
echo "Hello $1"
}
e
/foo/bar/second.sh:
#!/bin/bash
source ./first.sh
func1 World
funziona solo se first.shviene eseguito dalla stessa directory in cui first.shsi trova. Cioè. se il percorso di lavoro corrente della shell è /foo, il tentativo di eseguire il comando
cd /foo
./bar/second.sh
stampa errore:
/foo/bar/second.sh: line 4: func1: command not found
Questo perché source ./first.shè relativo al percorso di lavoro corrente, non al percorso dello script. Quindi una soluzione potrebbe essere quella di utilizzare subshell ed eseguire
(cd /foo/bar; ./second.sh)
Soluzione più generica
Dato...
/foo/bar/first.sh:
function func1 {
echo "Hello $1"
}
e
/foo/bar/second.sh:
#!/bin/bash
source $(dirname "$0")/first.sh
func1 World
poi
cd /foo
./bar/second.sh
stampe
Hello World
Come funziona
$0 restituisce il percorso relativo o assoluto allo script eseguito
dirname restituisce il percorso relativo alla directory, dove esiste lo script $ 0
$( dirname "$0" )il dirname "$0"comando restituisce il percorso relativo alla directory dello script eseguito, che viene quindi utilizzato come argomento per il sourcecomando
- in "second.sh",
/first.shaggiunge semplicemente il nome dello script di shell importato
source carica il contenuto del file specificato nella shell corrente