ในBash-Scripting Guide ขั้นสูงในตัวอย่างที่ 27-4 , 7-line จากด้านล่างฉันได้อ่าน:
ฟังก์ชั่นทำงานเป็นกระบวนการย่อย
ฉันทำการทดสอบใน Bash และดูเหมือนว่าข้อความข้างต้นผิด
ค้นหาในไซต์นี้ Bash Man และเครื่องมือค้นหาของฉัน
คุณมีคำตอบและต้องการอธิบายหรือไม่?
ในBash-Scripting Guide ขั้นสูงในตัวอย่างที่ 27-4 , 7-line จากด้านล่างฉันได้อ่าน:
ฟังก์ชั่นทำงานเป็นกระบวนการย่อย
ฉันทำการทดสอบใน Bash และดูเหมือนว่าข้อความข้างต้นผิด
ค้นหาในไซต์นี้ Bash Man และเครื่องมือค้นหาของฉัน
คุณมีคำตอบและต้องการอธิบายหรือไม่?
คำตอบ:
ขั้นสูงทุบตี Scripting คู่มือไม่ได้เสมอที่เชื่อถือได้และสคริปต์ตัวอย่างของการปฏิบัติที่มีออกลงวันเช่นใช้เลิกใช้อย่างมีประสิทธิภาพ backticks เพื่อทดแทนคำสั่งคือมากกว่า`command`$(command)
ในกรณีนี้มันไม่ถูกต้องอย่างโจ๋งครึ่ม
ส่วนของฟังก์ชั่นเชลล์ในคู่มือทุบตี (บัญญัติ) ระบุอย่างชัดเจนว่า
ฟังก์ชั่นเชลล์จะดำเนินการในบริบทเชลล์ปัจจุบัน ไม่มีกระบวนการใหม่ถูกสร้างขึ้นเพื่อตีความพวกเขา
ฟังก์ชั่นรั้งปีกกาจะทำงานภายในกระบวนการเรียกเปลือกเว้นแต่พวกเขาต้องการ subshell ของตัวเองซึ่งก็คือ:
&การเปลี่ยนเส้นทางหรือ env พิเศษ ตัวแปรจะไม่บังคับให้ subshell ใหม่:
hw(){
echo hello world from $BASHPID
echo var=$var
}
var=42 hw >&2
echo $BASHPID #unexports var=42 and restores stdout here
หากคุณกำหนดฟังก์ชันด้วยวงเล็บแทนที่จะเป็น curlies:
hw()(
echo hello world from $BASHPID
)
hw
echo $BASHPID
มันจะทำงานในกระบวนการใหม่เสมอ
การทดแทนคำสั่ง$()สร้างกระบวนการใน bash เสมอ (แต่ไม่ใช่ใน ksh หากคุณเรียกใช้ builtins ภายใน)
f() (...)ได้รับอนุญาต มีคำจำกัดความอื่นนอกเหนือจาก{...}และ(...)? ใน Bash ฉันยังไม่ได้เป็นคนอื่นเลย
function hw { echo hello world; } ไวยากรณ์ (ไม่จำเป็น()ถ้าคุณพิมพ์ออกมาfunctionและคุณสามารถระบุการเปลี่ยนเส้นทางได้หลังจบการแข่งขัน}หรือ)ตามhw(){ echo error; } >&2มานั่นเป็นเรื่องของมัน
f()(...)ดำเนินการเชลล์ของตัวเองเสมอโดยที่f(){...}ไม่ทำ
foo() [[ x = x ]]เป็นคำจำกัดความของฟังก์ชันที่ถูกต้องเช่นกัน แต่ถ้าคุณมองไปที่ฟังก์ชั่นที่มีคุณจะเห็นว่านี้ยังคงเป็นน้ำตาลประโยคสำหรับtype foo foo() { [[ x = x ]]; }เดียวกันเป็นจริงของการทำงาน subshell: กลายเป็นbar() ( : ) bar() { ( : ); }
คำสั่งในคำถามจากตัวอย่างนั้นดูเหมือนว่า:
echo ${arrayZ[@]/%e/$(replacement)}
ตัวอย่างกล่าวในภายหลัง:
# $( ... ) is command substitution.
# A function runs as a sub-process.
เป็นกุศล ABS คู่มือสิ่งที่พวกเขาเห็นได้ชัดว่าหมายถึงการเขียนเป็นฟังก์ชั่นที่ทำงานอยู่ภายในแทนคำสั่งและคำสั่งที่อยู่ภายในคำสั่งเปลี่ยนตัววิ่งในsubshell