Problem
Obecnie akceptowana odpowiedź działa tylko pod ważnymi warunkami. Dany...
/foo/bar/first.sh
:
function func1 {
echo "Hello $1"
}
i
/foo/bar/second.sh
:
#!/bin/bash
source ./first.sh
func1 World
działa to tylko wtedy, gdy first.sh
jest wykonywany z tego samego katalogu, w którym first.sh
znajduje się. To znaczy. jeśli bieżącą ścieżką roboczą powłoki jest /foo
, próba uruchomienia polecenia
cd /foo
./bar/second.sh
błąd wydruków:
/foo/bar/second.sh: line 4: func1: command not found
Dzieje się tak, ponieważ source ./first.sh
jest on względny w stosunku do bieżącej ścieżki roboczej, a nie ścieżki do skryptu. Stąd jednym rozwiązaniem może być użycie podpowłoki i uruchomienie
(cd /foo/bar; ./second.sh)
Bardziej ogólne rozwiązanie
Dany...
/foo/bar/first.sh
:
function func1 {
echo "Hello $1"
}
i
/foo/bar/second.sh
:
#!/bin/bash
source $(dirname "$0")/first.sh
func1 World
następnie
cd /foo
./bar/second.sh
wydruki
Hello World
Jak to działa
$0
zwraca względną lub bezwzględną ścieżkę do wykonywanego skryptu
dirname
zwraca ścieżkę względną do katalogu, w którym istnieje skrypt $ 0
$( dirname "$0" )
dirname "$0"
polecenie zwraca ścieżkę względną do katalogu wykonywanego skryptu, który jest następnie wykorzystywany jako argument dla source
komendy
- w „second.sh”,
/first.sh
po prostu dodaje nazwę zaimportowanego skryptu powłoki
source
ładuje zawartość określonego pliku do bieżącej powłoki