Sorun
Geçerli olarak kabul edilen cevap, yalnızca önemli koşullar altında işe yarar. Verilen ...
/foo/bar/first.sh:
function func1 {
echo "Hello $1"
}
ve
/foo/bar/second.sh:
#!/bin/bash
source ./first.sh
func1 World
bu, yalnızca , bulunduğu first.shdizinle aynı dizin içinden yürütüldüğünde çalışır first.sh. Yani. Kabuğun mevcut çalışma yolu ise /foo, komutu çalıştırma girişimi
cd /foo
./bar/second.sh
hata yazdırır:
/foo/bar/second.sh: line 4: func1: command not found
Bunun nedeni source ./first.sh, komut dosyasının yoluna değil, geçerli çalışma yoluna göreli olmasıdır. Bu nedenle bir çözüm alt kabuğu kullanmak ve çalıştırmak olabilir
(cd /foo/bar; ./second.sh)
Daha genel çözüm
Verilen ...
/foo/bar/first.sh:
function func1 {
echo "Hello $1"
}
ve
/foo/bar/second.sh:
#!/bin/bash
source $(dirname "$0")/first.sh
func1 World
sonra
cd /foo
./bar/second.sh
baskılar
Hello World
Nasıl çalışır
$0 çalıştırılan betiğe göreli veya mutlak yolu döndürür
dirname $ 0 komut dosyasının mevcut olduğu dizine göreceli yolu döndürür
$( dirname "$0" )dirname "$0"Komut daha sonra bağımsız değişkeni olarak kullanılır yürütülen komut, bir dizinine göre yolunu döndürür sourcekomutu
- "second.sh" içinde,
/first.shsadece içe aktarılan kabuk betiğinin adını ekler
source belirtilen dosyanın içeriğini mevcut kabuğa yükler