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.sh
dizinle 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 source
komutu
- "second.sh" içinde,
/first.sh
sadece içe aktarılan kabuk betiğinin adını ekler
source
belirtilen dosyanın içeriğini mevcut kabuğa yükler