สิ่งที่คุณทำที่นี่รวมถึงsecond.shและthird.shเป็นสคริปต์ย่อยที่ทำงานในกระบวนการเดียวกันซึ่งเรียกว่า "การจัดหา" ในการเขียนโปรแกรมเชลล์ . ./second.shโดยทั่วไปเทียบเท่ากับการรวมข้อความของsecond.shณ จุดนั้น exitคำสั่งออกจากกระบวนการที่มันไม่สำคัญว่าคุณจะเรียกมันว่าในสคริปต์เดิมหรือในสคริปต์ที่มา
หากสิ่งที่คุณต้องการจะทำคือเรียกใช้คำสั่งในsecond.shและthird.shและพวกเขาไม่จำเป็นต้องเข้าถึงหรือการปรับเปลี่ยนตัวแปรและฟังก์ชั่นจากสคริปต์เดิมเรียกสคริปต์เหล่านี้เป็นกระบวนการที่เด็ก
#! /bin/ksh
echo "prova"
./second.sh
echo "ho lanciato il secondo"
./third.sh
echo "ho lanciato il terzo"
หากคุณต้องการสคริปต์อื่น ๆ เพื่อเข้าถึงตัวแปรและฟังก์ชั่นจากสคริปต์ต้นฉบับ แต่ไม่ต้องแก้ไขให้เรียกสคริปต์เหล่านี้ใน subshells Subshells เป็นกระบวนการที่แยกกันดังนั้นexitออกจากพวกเขาเท่านั้น
#! /bin/ksh
echo "prova"
(. ./second.sh)
echo "ho lanciato il secondo"
(. ./third.sh)
echo "ho lanciato il terzo"
หากคุณต้องการใช้ตัวแปรหรือฟังก์ชั่นที่กำหนดไว้ในsecond.shและthird.shในสคริปต์หลักแล้วคุณจะต้องจัดหาพวกเขา
returnbuiltin ทางออกเพียงสคริปต์ที่มาและไม่ได้เป็นกระบวนการทั้งหมด - ที่หนึ่งของความแตกต่างระหว่างไม่กี่รวมทั้งสคริปต์อื่นที่มี.คำสั่งและรวมถึงข้อความในสคริปต์แม่ ถ้าสคริปต์มาเพียงโทรexitที่ระดับบนสุดเมื่อเทียบกับการทำงานภายในแล้วคุณสามารถเปลี่ยนเข้าexit returnคุณสามารถทำได้โดยไม่ต้องแก้ไขสคริปต์โดยใช้นามแฝง
#! /bin/ksh
echo "prova"
alias exit=return
. ./second.sh
echo "ho lanciato il secondo"
. ./third.sh
unalias exit
echo "ho lanciato il terzo"
ถ้าexitเรียกอีกอย่างว่าฟังก์ชั่นภายในฉันไม่คิดว่าจะมีวิธีที่ไม่ยุ่งยาก วิธีที่ยุ่งยากคือตั้งค่ากับดักทางออกและวางรหัสของคุณไว้ที่นั่น
#!/bin/ksh
do_first () {
echo "prova"
trap "after_second" EXIT
. ./second.sh
after_second
}
after_second () {
echo "ho lanciato il secondo"
trap "after_third" EXIT
. ./third.sh
after_third
}
after_third () {
trap - EXIT
echo "ho lanciato il terzo"
}
do_first
.คำสั่งซึ่งแหล่งไฟล์อื่นในเปลือกปัจจุบัน ไม่มีเชลล์ย่อยหรือเชลล์ย่อยที่เกี่ยวข้อง คุณหมายถึงดำเนินการsecond.shและthird.shแทนที่จะจัดหามาหรือไม่