"Xuất khẩu" một hàm sử dụng export -f
sẽ tạo ra một biến môi trường với thân hàm. Xem xét ví dụ này:
$ fn(){ echo \'\"\ \ \$; }
$ export -f fn
$ sh -c printenv\ fn
() { echo \'\"\ \ \$
}
Điều này có nghĩa là chỉ vỏ (chỉ Bash?) Sẽ có thể chấp nhận hàm. Bạn cũng có thể tự thiết lập chức năng vì Bash chỉ xem xét các envv bắt đầu bằng () {
hàm:
$ fn2='() { echo Hi;}' sh -c fn2
Hi
$ fn3='() {' sh -c :
sh: fn3: line 1: syntax error: unexpected end of file
sh: error importing function definition for `fn3'
Nếu bạn cần "xuất" biến này qua SSH, thì bạn thực sự cần hàm dưới dạng chuỗi. Điều này có thể được thực hiện với tùy chọn in ( -p
) cho các hàm ( -f
) của tích declare
hợp:
$ declare -pf fn
fn ()
{
echo \'\"\ \ \$
}
Điều này rất hữu ích nếu bạn có mã phức tạp hơn cần được thực thi qua SSH. Hãy xem xét kịch bản hư cấu sau đây:
#!/bin/bash
remote_main() {
local dest="$HOME/destination"
tar xzv -C "$dest"
chgrp -R www-data "$dest"
# Ensure that newly written files have the 'www-data' group too
find "$dest" -type d -exec chmod g+s {} \;
}
tar cz files/ | ssh user@host "$(declare -pf remote_main); remote_main"
#!/bin/sh
thành#!/bin/bash
và saudoit() {...}
chỉexport -f doit