"การส่งออก" ฟังก์ชั่นที่ใช้export -f
สร้างตัวแปรสภาพแวดล้อมด้วยร่างกายของฟังก์ชั่น ลองพิจารณาตัวอย่างนี้:
$ fn(){ echo \'\"\ \ \$; }
$ export -f fn
$ sh -c printenv\ fn
() { echo \'\"\ \ \$
}
ซึ่งหมายความว่าเฉพาะเชลล์ (แค่ทุบตี?) เท่านั้นที่จะสามารถรับฟังก์ชั่นได้ นอกจากนี้คุณยังสามารถตั้งค่าฟังก์ชั่นได้ด้วยตัวเองเพราะ Bash จะพิจารณา envvars ที่เริ่มต้นด้วย() {
ฟังก์ชั่น
$ 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'
หากคุณต้องการ "ส่งออก" ตัวแปรนี้ผ่าน SSH คุณต้องใช้ฟังก์ชันเป็นสตริง สามารถทำได้ด้วยตัวเลือกการพิมพ์ ( -p
) สำหรับฟังก์ชั่น ( -f
) ของdeclare
ตัวเครื่อง:
$ declare -pf fn
fn ()
{
echo \'\"\ \ \$
}
สิ่งนี้มีประโยชน์มากหากคุณมีรหัสที่ซับซ้อนมากขึ้นซึ่งจำเป็นต้องเรียกใช้งานผ่าน SSH พิจารณาสคริปต์ที่สมมติขึ้นดังต่อไปนี้:
#!/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
เป็น#!/bin/bash
และหลังdoit() {...}
เพียงexport -f doit