Vui lòng cho tôi biết làm thế nào để xuất một hàm trong trình bao mẹ (bash, sh hoặc ksh) để hàm sẽ có sẵn cho tất cả quy trình con được lấy ra từ quy trình mẹ?
Vui lòng cho tôi biết làm thế nào để xuất một hàm trong trình bao mẹ (bash, sh hoặc ksh) để hàm sẽ có sẵn cho tất cả quy trình con được lấy ra từ quy trình mẹ?
Câu trả lời:
Các export -f
tính năng là cụ thể cho Bash:
cha mẹ
#!/bin/bash
plus1 () { echo $(($1 + 1)); }
echo $(plus1 8)
export -f plus1
./child 14 21
đứa trẻ
#!/bin/bash
echo $(plus1 $(($1 * $2)) )
Trong sh
đó, không thể xuất một hàm, như Charles Duffy đã lưu ý .
Nếu bạn đang sử dụng ksh hoặc zsh:
Bạn có thể sử dụng biến môi trường FPATH
, trong đó bạn có thể đặt tất cả các hàm của mình.
Nếu FPATH
được đặt trên trình thông dịch tương tác và lệnh hoặc hàm không được tìm thấy trong môi trường shell hiện tại hoặc PATH
, các thư mục được liệt kê ở đó sẽ được tìm kiếm sự tồn tại của tệp có tên sau lệnh bị thiếu. Nếu một cái được tìm thấy, nó có nguồn trong môi trường shell hiện tại và được mong đợi để xác định chức năng.
Vì vậy, bạn có thể đặt tất cả các chức năng của mình ở một vị trí FPATH
và các tập lệnh con cũng có thể tìm thấy nó.
Bạn có thể sử dụng autoload
lệnh trong các tập lệnh shell để tải các chức năng bạn yêu cầu:
autoload fun_a fun_b
Trong zsh, autoload
là bắt buộc FPATH
để hoạt động. Trong ksh
và những người thân của nó, tôi tin rằng nó chỉ đơn giản khiến các hàm được định nghĩa trong FPATH
ghi đè lệnh thông thường trong PATH của bạn, giống như chúng sẽ xảy ra nếu được định nghĩa trực tiếp.
Một số chi tiết về FPATH
và autoload
:
Nếu bạn tạo các biểu mẫu con bằng ( )
thì chúng sẽ kế thừa một ảnh chụp nhanh của tất cả các định nghĩa, tham số và biến shell.
Nếu bạn thực thi chúng giống như các chương trình thì bạn có thể đưa các định nghĩa vào .bashrc
.
Nếu bạn đang cố gắng giả mạo một tập lệnh hiện có để thực hiện một trình bao bọc hoặc thay thế cho một lệnh PATH, thì lệnh .bashrc
này sẽ hoạt động tùy thuộc vào chi tiết của việc thực thi. Nếu không, thay vào đó bạn có thể thực thi một tập lệnh trình bao bọc đơn giản thực hiện một .
hoặc source
một tệp bao gồm xác định các chức năng và sau đó thực hiện điều tương tự với tập lệnh shell với các lệnh được thay thế.
Tập lệnh trình bao bọc có thể trông giống như sau:
script=$1
shift
. include.sh
. $script "$@"
Ý tưởng là tham số đầu tiên là tên của tập lệnh thực và các tham số còn lại là args, sau đó tập lệnh trên được chạy thay thế.
declare -x -f NAME
Thêm thông tin
-f hạn chế hành động hoặc hiển thị đối với tên và định nghĩa hàm -x để xuất NAME
bash
. ( ksh
'S đối tác để declare
, typeset
, có một -x
tùy chọn, nhưng nó chỉ áp dụng cho các biến , không phải chức năng; ditto cho zsh
).