วัตถุประสงค์ของการส่งออกฟังก์ชั่นในทุบตี


1

ถ้าเราดูตัวอย่างต่อไปนี้:

# testing(){ echo hello;}
# testing
hello
# echo $(testing)
hello
# echo testing >script
# ./script
./script: line 1: testing: command not found
# source ./script
hello
# export -f testing
# ./script
hello

ปรากฎว่าbashฟังก์ชั่นจะต้องส่งออกเฉพาะในกรณีที่คุณต้องการใช้ในสคริปต์ที่ไม่ได้มา ฉันลองใช้หลายระดับของ subshells พฤติกรรมเหมือนกัน บางคนสามารถยืนยันสิ่งนี้ได้เพราะฉันพบว่ามันขัดแย้งกับการอ้างว่าตัวแปรท้องถิ่นไม่มีอยู่ใน subshells

คำตอบ:


1

source ./scriptไม่สร้าง subshell สคริปต์ถูกเรียกใช้งานในเชลล์ปัจจุบัน ไม่มีอะไรที่ไม่คาดคิดที่นี่

อย่างไรก็ตามการทดแทนคำสั่งเช่นเดียวกับในecho $(testing) จะสร้าง subshell ถ้าฉันทำให้ถูกต้องคุณจะประหลาดใจว่ามันใช้งานได้

นี่คือคำอธิบายในคู่มืออ้างอิง Bash, ส่วนคำสั่ง Environment Execution Environment :

การทดแทนคำสั่งคำสั่งที่จัดกลุ่มด้วยวงเล็บและคำสั่งแบบอะซิงโครนัสถูกเรียกใช้ในสภาพแวดล้อม subshell ที่ซ้ำกันของสภาพแวดล้อมของเชลล์ยกเว้นว่าดักจับโดยเชลล์จะถูกรีเซ็ตเป็นค่าที่เชลล์สืบทอดจากพาเรนต์เมื่อร้องขอ

ดังนั้นจึงเป็นข้อยกเว้นที่เป็นเอกสารสำหรับการอ้างสิทธิ์ว่าไม่มีตัวแปรท้องถิ่นใน subshells


-1

ฟังก์ชั่นเป็นส่วนหนึ่งของสภาพแวดล้อมของกระบวนการโดยการส่งออกเช่นเดียวกับตัวแปร ดังนั้นเมื่อต้องการสืบทอดพวกเขาสำหรับกระบวนการย่อยเช่นสคริปต์ที่เรียกว่าพวกเขาจะต้องส่งออก จนกว่ามันจะไม่ถูกส่งออกมันเป็นส่วนหนึ่งของตัวแปรของเชลล์เท่านั้น

หมายเหตุ: คุณสามารถแสดงสภาพแวดล้อมในปัจจุบันที่มีenvคำสั่ง builtin setและรายการตัวแปรที่มี

Note2: sourceคำสั่งไม่ได้สร้าง subshell (subprocess) ตามที่คนอื่นชี้ให้เห็นดังนั้นการsource scriptทำงานตามที่คุณแสดงในตัวอย่าง แต่./scriptคำสั่งสร้าง subshell ดังนั้นคุณต้องส่งออกฟังก์ชั่น

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.