Das Problem
Die aktuell akzeptierte Antwort funktioniert nur unter wichtigen Bedingungen. Gegeben...
/foo/bar/first.sh
::
function func1 {
echo "Hello $1"
}
und
/foo/bar/second.sh
::
#!/bin/bash
source ./first.sh
func1 World
Dies funktioniert nur, wenn das first.sh
aus demselben Verzeichnis ausgeführt wird, in dem first.sh
sich das befindet. Dh. Wenn der aktuelle Arbeitspfad der Shell lautet /foo
, wird versucht, den Befehl auszuführen
cd /foo
./bar/second.sh
Druckfehler:
/foo/bar/second.sh: line 4: func1: command not found
Dies source ./first.sh
liegt daran, dass der Pfad relativ zum aktuellen Arbeitspfad und nicht zum Pfad des Skripts ist. Daher könnte eine Lösung darin bestehen, Subshell zu verwenden und auszuführen
(cd /foo/bar; ./second.sh)
Generischere Lösung
Gegeben...
/foo/bar/first.sh
::
function func1 {
echo "Hello $1"
}
und
/foo/bar/second.sh
::
#!/bin/bash
source $(dirname "$0")/first.sh
func1 World
dann
cd /foo
./bar/second.sh
druckt
Hello World
Wie es funktioniert
$0
Gibt den relativen oder absoluten Pfad zum ausgeführten Skript zurück
dirname
Gibt den relativen Pfad zum Verzeichnis zurück, in dem das $ 0-Skript vorhanden ist
$( dirname "$0" )
Der dirname "$0"
Befehl gibt den relativen Pfad zum Verzeichnis des ausgeführten Skripts zurück, das dann als Argument für den source
Befehl verwendet wird
- Hängt in "second.sh"
/first.sh
nur den Namen des importierten Shell-Skripts an
source
Lädt den Inhalt der angegebenen Datei in die aktuelle Shell