โปรดบอกวิธีการส่งออกฟังก์ชันในพาเรนต์เชลล์ (bash, sh หรือ ksh) เพื่อให้ฟังก์ชันนี้พร้อมใช้งานสำหรับกระบวนการย่อยทั้งหมดที่เรียกใช้จากกระบวนการหลัก
โปรดบอกวิธีการส่งออกฟังก์ชันในพาเรนต์เชลล์ (bash, sh หรือ ksh) เพื่อให้ฟังก์ชันนี้พร้อมใช้งานสำหรับกระบวนการย่อยทั้งหมดที่เรียกใช้จากกระบวนการหลัก
คำตอบ:
export -f
คุณลักษณะเป็นเฉพาะกับทุบตี:
ผู้ปกครอง
#!/bin/bash
plus1 () { echo $(($1 + 1)); }
echo $(plus1 8)
export -f plus1
./child 14 21
เด็ก
#!/bin/bash
echo $(plus1 $(($1 * $2)) )
ในsh
นั้นไม่สามารถส่งออกฟังก์ชันได้ตามที่ Charles Duffyระบุไว้
หากคุณใช้ ksh หรือ zsh:
คุณสามารถใช้ตัวแปรสภาพแวดล้อมFPATH
ซึ่งคุณสามารถวางฟังก์ชันทั้งหมดของคุณได้
หากFPATH
ตั้งค่าไว้บนอินเทอร์พรีเตอร์แบบโต้ตอบและไม่พบคำสั่งหรือฟังก์ชันในสภาพแวดล้อมเชลล์ปัจจุบันหรือPATH
ไดเร็กทอรีที่แสดงรายการจะถูกค้นหาการมีอยู่ของไฟล์ที่ตั้งชื่อตามคำสั่งที่หายไป หากพบจะมีที่มาในสภาพแวดล้อมเชลล์ปัจจุบันและคาดว่าจะกำหนดฟังก์ชัน
ดังนั้นคุณสามารถวางฟังก์ชันทั้งหมดของคุณในตำแหน่งที่ตั้งFPATH
และสคริปต์ลูกก็จะสามารถค้นหาได้เช่นกัน
คุณสามารถใช้autoload
คำสั่งในเชลล์สคริปต์เพื่อโหลดฟังก์ชันที่คุณต้องการ:
autoload fun_a fun_b
ใน zsh autoload
จำเป็นสำหรับFPATH
การทำงาน ในksh
และญาติสนิทฉันเชื่อว่ามันทำให้ฟังก์ชันที่กำหนดไว้FPATH
เพื่อแทนที่คำสั่งปกติใน PATH ของคุณตามที่กำหนดไว้โดยตรง
รายละเอียดบางประการเกี่ยวกับFPATH
และautoload
:
หากคุณสร้าง subshells ด้วยสิ่ง( )
นั้นจะสืบทอด snapshot ของนิยามพารามิเตอร์และตัวแปรเชลล์ทั้งหมด
หากคุณดำเนินการเหมือนโปรแกรมคุณสามารถใส่คำจำกัดความ.bashrc
ได้
หากคุณพยายามปลอมแปลงสคริปต์ที่มีอยู่เพื่อเรียกใช้งาน wrapper หรือการแทนที่คำสั่ง PATH .bashrc
จะทำงานได้โดยขึ้นอยู่กับรายละเอียดของการดำเนินการ ถ้าไม่คุณแทนสามารถรันสคริปต์เสื้อคลุมที่เพียงไม่ได้.
หรือsource
การรวมไฟล์ที่กำหนดฟังก์ชั่นและจากนั้นก็จะเป็นสิ่งเดียวกันกับเชลล์สคริปต์ด้วยคำสั่งที่จะใช้แทน
สคริปต์ Wrapper อาจมีลักษณะดังนี้:
script=$1
shift
. include.sh
. $script "$@"
แนวคิดคือพารามิเตอร์แรกคือชื่อของสคริปต์จริงและพารามิเตอร์ที่เหลือคือ args จากนั้นสคริปต์ด้านบนจะถูกเรียกใช้แทน
declare -x -f NAME
ข้อมูลเพิ่มเติม
-f จำกัด การกระทำหรือแสดงชื่อฟังก์ชันและคำจำกัดความ -x เพื่อทำการส่งออก NAME
bash
( ksh
's คู่ไปdeclare
, typeset
มีความ-x
ตัวเลือก แต่มันจะใช้กับตัวแปรไม่ฟังก์ชันเหมือนกันสำหรับzsh
)
ฟังก์ชันไม่สามารถส่งออกได้ตามธรรมชาติ อย่างไรก็ตามคุณสามารถส่งออกสตริงได้ดังนั้นฉันมีเคล็ดลับเล็กน้อยที่นี่:
func="$(typeset -f funcname)"
export func
ในการนำเข้าฟังก์ชันให้กำหนดใหม่จากสตริงที่ส่งออก:
# in subshell
eval "$func"