Shell Script Loader là giải pháp của tôi cho việc này.
Nó cung cấp một hàm có tên bao gồm () có thể được gọi nhiều lần trong nhiều tập lệnh để chỉ một tập lệnh nhưng sẽ chỉ tải tập lệnh một lần. Hàm có thể chấp nhận đường dẫn hoàn chỉnh hoặc đường dẫn một phần (tập lệnh được tìm kiếm trong đường dẫn tìm kiếm). Một hàm tương tự có tên là load () cũng được cung cấp sẽ tải các tập lệnh vô điều kiện.
Nó hoạt động cho bash , ksh , pd ksh và zsh với các tập lệnh được tối ưu hóa cho mỗi một trong số chúng; và các shell khác tương thích chung với sh gốc như tro , dash , gia truyền sh , v.v., thông qua một tập lệnh phổ biến tự động tối ưu hóa các chức năng của nó tùy thuộc vào các tính năng mà shell có thể cung cấp.
[Ví dụ cho thấy]
bắt đầu
Đây là một kịch bản khởi động tùy chọn. Đặt các phương thức khởi động ở đây chỉ là một sự thuận tiện và có thể được đặt trong kịch bản chính thay thế. Kịch bản này cũng không cần thiết nếu các kịch bản được biên dịch.
#!/bin/sh
# load loader.sh
. loader.sh
# include directories to search path
loader_addpath /usr/lib/sh deps source
# load main script
load main.sh
chính
include a.sh
include b.sh
echo '---- main.sh ----'
# remove loader from shellspace since
# we no longer need it
loader_finish
# main procedures go from here
# ...
tro
include main.sh
include a.sh
include b.sh
echo '---- a.sh ----'
b.sh
include main.sh
include a.sh
include b.sh
echo '---- b.sh ----'
đầu ra:
---- b.sh ----
---- a.sh ----
---- main.sh ----
Điều tốt nhất là các tập lệnh dựa trên nó cũng có thể được biên dịch để tạo thành một tập lệnh duy nhất với trình biên dịch có sẵn.
Đây là một dự án sử dụng nó: http://sourceforge.net/p/playshell/code/ci/master/tree/ . Nó có thể chạy một cách hợp lý có hoặc không biên dịch các tập lệnh. Việc biên dịch để tạo ra một tập lệnh cũng có thể xảy ra và rất hữu ích trong quá trình cài đặt.
Tôi cũng đã tạo một nguyên mẫu đơn giản hơn cho bất kỳ bên bảo thủ nào có thể muốn có một ý tưởng ngắn gọn về cách tập lệnh triển khai hoạt động: https://sourceforge.net/p/loader/code/ci/base/tree/loader-include-prototype .bash . Nó nhỏ và bất kỳ ai cũng có thể bao gồm mã trong tập lệnh chính của họ nếu họ muốn nếu mã của họ có ý định chạy với Bash 4.0 hoặc mới hơn và nó cũng không sử dụng eval
.