ตัวแปรสภาพแวดล้อมที่มีฟังก์ชั่นเป็นแฮ็คทุบตี Zsh ไม่มีอะไรคล้ายกัน คุณสามารถทำสิ่งที่คล้ายกับรหัสไม่กี่บรรทัด ตัวแปรสภาพแวดล้อมมีสตริง รุ่นเก่าของทุบตีก่อนทำพิษถูกค้นพบที่เก็บไว้รหัสฟังก์ชั่นในตัวแปรที่มีชื่อเป็นที่ของฟังก์ชั่นและมีค่าตามด้วยรหัสของฟังก์ชั่นตามด้วย() {
}
คุณสามารถใช้รหัสต่อไปนี้เพื่อนำเข้าตัวแปรด้วยการเข้ารหัสนี้และพยายามเรียกใช้พวกเขาด้วยการตั้งค่าเหมือนทุบตี โปรดทราบว่า zsh ไม่สามารถเลียนแบบคุณลักษณะทุบตีทั้งหมดสิ่งที่คุณทำได้คือเข้าใกล้นิดหน่อย (เช่นเพื่อ$foo
แยกค่าและขยายอักขระตัวแทนและสร้างอาร์เรย์แบบ 0)
bash_function_preamble='
emulate -LR ksh
'
for name in ${(k)parameters}; do
[[ "-$parameters[name]-" = *-export-* ]] || continue
[[ ${(P)name} = '() {'*'}' ]] || continue
((! $+builtins[$name])) || continue
functions[$name]=$bash_function_preamble${${${(P)name}#"() {"}%"}"}
done
(ดังที่Stéphane Chazelasผู้ค้นพบต้นฉบับของ Shellshock กล่าวว่ารุ่นก่อนหน้าของคำตอบนี้สามารถเรียกใช้รหัสโดยอำเภอใจได้ณ จุดนี้หากคำจำกัดความของฟังก์ชั่นผิดรูปแบบรุ่นนี้ไม่ แต่แน่นอนทันทีที่คุณดำเนินการคำสั่งใด ๆ มันอาจเป็นฟังก์ชั่นที่นำเข้าจากสภาพแวดล้อม)
ฟังก์ชันการเข้ารหัส bash รุ่นหลัง Shellshock ในสภาพแวดล้อมโดยใช้ชื่อตัวแปรที่ไม่ถูกต้อง (เช่นBASH_FUNC_myfunc%%
) สิ่งนี้ทำให้ยากต่อการแยกวิเคราะห์ที่เชื่อถือได้เนื่องจาก zsh ไม่ได้จัดเตรียมอินเทอร์เฟซเพื่อแยกชื่อตัวแปรดังกล่าวจากสภาพแวดล้อม
ฉันไม่แนะนำให้ทำเช่นนี้ การใช้ฟังก์ชันที่เอ็กซ์พอร์ตในสคริปต์เป็นความคิดที่ไม่ดี: มันสร้างการพึ่งพาที่มองไม่เห็นในสคริปต์ หากคุณเคยเรียกใช้สคริปต์ของคุณในสภาพแวดล้อมที่ไม่มีฟังก์ชั่นของคุณ (ในเครื่องอื่นในงาน cron หลังจากเปลี่ยนไฟล์การเริ่มต้นเชลล์ของคุณ ... ) สคริปต์ของคุณจะไม่ทำงานอีกต่อไป ให้จัดเก็บฟังก์ชันทั้งหมดของคุณไว้ในไฟล์ที่แยกต่างหากอย่างน้อยหนึ่งไฟล์ (เช่น~/lib/shell/foo.sh
) และเริ่มสคริปต์ของคุณโดยการนำเข้าฟังก์ชั่นที่ใช้ ( . ~/lib/shell/foo.sh
) วิธีนี้หากคุณปรับเปลี่ยนfoo.sh
คุณสามารถค้นหาสคริปต์ที่ต้องการได้อย่างง่ายดาย หากคุณคัดลอกสคริปต์คุณสามารถค้นหาไฟล์เสริมที่ต้องการได้อย่างง่ายดาย
Zsh (และ ksh ก่อนหน้า) ทำให้สะดวกยิ่งขึ้นด้วยการจัดเตรียมวิธีการโหลดฟังก์ชันในสคริปต์ที่ใช้งานโดยอัตโนมัติ ข้อ จำกัด คือคุณสามารถใส่ได้เพียงหนึ่งฟังก์ชันต่อไฟล์ ประกาศฟังก์ชันเป็น autoloaded และวางนิยามฟังก์ชันในไฟล์ที่มีชื่อคือชื่อของฟังก์ชัน ใส่ไฟล์นี้ในไดเรกทอรีที่ระบุไว้$fpath
(ซึ่งคุณสามารถกำหนดค่าผ่านFPATH
ตัวแปรสภาพแวดล้อม) ในสคริปต์ของคุณประกาศฟังก์ชัน autoloaded autoload -U foo
กับ
นอกจากนี้ zsh สามารถรวบรวมสคริปต์เพื่อประหยัดเวลาในการแยกวิเคราะห์ โทรzcompile
เพื่อรวบรวมสคริปต์ สิ่งนี้จะสร้างไฟล์ที่มี.zwc
นามสกุล หากไฟล์นี้มีอยู่แล้วautoload
จะโหลดไฟล์ที่คอมไพล์แทนรหัสแหล่งที่มา คุณสามารถใช้zrecompile
ฟังก์ชันเพื่อคอมไพล์นิยามฟังก์ชันทั้งหมดในไดเรกทอรี