Vấn đề
Câu trả lời được chấp nhận rõ ràng chỉ hoạt động trong điều kiện quan trọng. Được...
/foo/bar/first.sh
:
function func1 {
echo "Hello $1"
}
và
/foo/bar/second.sh
:
#!/bin/bash
source ./first.sh
func1 World
điều này chỉ hoạt động nếu first.sh
được thực thi từ trong cùng một thư mục first.sh
có vị trí. I E. nếu đường làm việc hiện tại của shell là /foo
, cố gắng chạy lệnh
cd /foo
./bar/second.sh
lỗi in:
/foo/bar/second.sh: line 4: func1: command not found
Đó là bởi vì source ./first.sh
đường dẫn liên quan đến đường dẫn làm việc hiện tại, không phải đường dẫn của tập lệnh. Do đó, một giải pháp có thể là sử dụng vỏ con và chạy
(cd /foo/bar; ./second.sh)
Giải pháp chung chung hơn
Được...
/foo/bar/first.sh
:
function func1 {
echo "Hello $1"
}
và
/foo/bar/second.sh
:
#!/bin/bash
source $(dirname "$0")/first.sh
func1 World
sau đó
cd /foo
./bar/second.sh
bản in
Hello World
Làm thế nào nó hoạt động
$0
trả về đường dẫn tương đối hoặc tuyệt đối đến tập lệnh được thực thi
dirname
trả về đường dẫn tương đối đến thư mục, nơi tập lệnh $ 0 tồn tại
$( dirname "$0" )
các dirname "$0"
lệnh trả về đường dẫn tương đối đến thư mục của kịch bản thực hiện, sau đó được sử dụng như là đối số cho source
lệnh
- trong "second.sh",
/first.sh
chỉ cần thêm tên của tập lệnh shell đã nhập
source
tải nội dung của tệp được chỉ định vào trình bao hiện tại