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.sh
viene eseguito dalla stessa directory in cui first.sh
si 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 source
comando
- in "second.sh",
/first.sh
aggiunge semplicemente il nome dello script di shell importato
source
carica il contenuto del file specificato nella shell corrente