Đề cập đến một tệp liên quan đến việc thực thi tập lệnh


94

Trong tập lệnh bash mà tôi đang viết, tôi sử dụng sourceđể bao gồm biến được định nghĩa trong tệp cấu hình. Tập lệnh được thực thi là act.sh, trong khi tập lệnh là sourced act.conf.sh, vì vậy trong act.shtôi có:

source act.conf.sh

Tuy nhiên điều này chỉ hoạt động khi chạy act.shtrong thư mục chứa nó, vì act.conf.shnó đề cập đến tệp được đặt trong thư mục làm việc. Có giải pháp nào để làm cho nó tham chiếu đến tệp liên quan đến tập lệnh đang thực thi mà không cần gọi cdkhông? Cảm ơn.

Câu trả lời:


116

Hãy xem: Mục Câu hỏi thường gặp về BASH # 28: "Làm cách nào để xác định vị trí của tập lệnh của tôi? Tôi muốn đọc một số tệp cấu hình từ cùng một nơi."

Bất kỳ giải pháp nào sẽ không hoạt động 100% thời gian:

Điều quan trọng là phải nhận ra rằng trong trường hợp chung, vấn đề này không có giải pháp. Bất kỳ cách tiếp cận nào bạn có thể đã nghe nói đến và bất kỳ cách tiếp cận nào sẽ được trình bày chi tiết bên dưới, đều có sai sót và sẽ chỉ hoạt động trong những trường hợp cụ thể. Trước hết, hãy cố gắng tránh hoàn toàn sự cố bằng cách không phụ thuộc vào vị trí của tập lệnh của bạn!

Nếu bạn cần phải viết một rất cụ thể tái sử dụng, sau đó lấy đường dẫn chính xác như một tham số để kịch bản của bạn sẽ là phương pháp đáng tin cậy nhất .

Giả sử tập lệnh của bạn sẽ chỉ được chạy từ một số shell nhất định và chỉ với một chút linh hoạt cần thiết, bạn có thể có thể giải tỏa một số hoang tưởng này. Vẫn tốt để xem xét các lựa chọn của bạn. Có những mẫu phổ biến mà mọi người sử dụng đặc biệt có vấn đề.

Đặc biệt, Câu hỏi thường gặp khuyên bạn nên tránh $0biến số thường được sử dụng :

Không có gì được đọc $0sẽ không bao giờ có khả năng chống đạn, bởi vì $0bản thân nó không đáng tin cậy.

Thay vào đó, bạn có thể sử dụng $BASH_SOURCEthay thế. Một cái gì đó như thế này:

source "${BASH_SOURCE%/*}/act.conf.sh"

Cũng có một số lưu ý đối với giải pháp này. Hãy xem trang Câu hỏi thường gặp để xem sự cân bằng giữa các giải pháp khác nhau. Họ dường như đề xuất cdkết hợp với $BASH_SOURCEtrong các trường hợp mà nó sẽ phù hợp với bạn, vì bạn gặp phải tình trạng lỗi tiện dụng khi nó không thể mở rộng đúng cách.


1
Cảm ơn, tôi sẽ sử dụng readlink. Đã không thể xác định từ khóa để tìm kiếm nên đăng các câu hỏi ở đây ....
Ryan Li

9
Bạn có thể đưa thông tin liên quan vào câu trả lời trong trường hợp câu hỏi thường gặp về bash xảy ra không?
Merlyn Morgan-Graham

3
Liên kết khuyến nghị: cd "${BASH_SOURCE%/*}" || exithoặc read somevar < "${BASH_SOURCE%/*}/etc/somefile", Liên kết hết sức khuyến khích $0 "Không có gì ghi $ 0 sẽ không bao giờ chống được đạn, bởi vì bản thân $ 0 không đáng tin cậy."
ThorSummoner

10
% / * Sau BASH_SOURCE làm gì và làm như thế nào?
Silicomancer


34

Xem phần này: Bash: Làm cách nào _best_ để bao gồm các tập lệnh khác?

Tôi đề nghị sử dụng:

source $(dirname $0)/act.conf.sh

8
Đây không phải là câu trả lời mà bạn tìm kiếm. $0vốn dĩ là lỗi. Xem hàng đầu bình chọn và trả lời được chấp nhận cho lý do tại sao, hoặc đơn giản là đọc mywiki.wooledge.org/BashFAQ/028 - giải pháp ngắn cho câu hỏi hỏi là cái gì đó nhưsource "${BASH_SOURCE%/*}/act.conf.sh"
Merlyn Morgan-Graham

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.