Những gì bạn đang làm ở đây là bao gồm second.sh
và third.sh
như các tập lệnh con đang chạy trong cùng một quy trình, được gọi là chương trình tìm nguồn cung ứng trực tuyến. . ./second.sh
về cơ bản là tương đương với việc bao gồm các văn bản second.sh
tại thời điểm đó. Các exit
lệnh thoát quá trình này, nó không quan trọng cho dù bạn gọi nó là trong kịch bản gốc hoặc trong một kịch bản nguồn.
Nếu tất cả những gì bạn muốn làm là chạy các lệnh trong second.sh
và third.sh
chúng không cần truy cập hoặc sửa đổi các biến và hàm từ tập lệnh gốc, hãy gọi các tập lệnh này là các tiến trình con.
#! /bin/ksh
echo "prova"
./second.sh
echo "ho lanciato il secondo"
./third.sh
echo "ho lanciato il terzo"
Nếu bạn cần các tập lệnh khác để truy cập các biến và hàm từ tập lệnh gốc, nhưng không sửa đổi chúng, thì hãy gọi các tập lệnh này trong các khung con. Subshells là các quá trình riêng biệt, vì vậy exit
chỉ thoát chúng.
#! /bin/ksh
echo "prova"
(. ./second.sh)
echo "ho lanciato il secondo"
(. ./third.sh)
echo "ho lanciato il terzo"
Nếu bạn cần sử dụng các biến hoặc hàm được xác định trong second.sh
và third.sh
trong tập lệnh gốc, thì bạn sẽ cần tiếp tục tìm nguồn cung ứng chúng.
Nội dung return
dựng sẵn chỉ thoát khỏi tập lệnh có nguồn gốc chứ không phải toàn bộ quá trình - đó là một trong số ít sự khác biệt giữa việc bao gồm một tập lệnh khác với .
lệnh và bao gồm văn bản của nó trong tập lệnh gốc. Nếu các tập lệnh có nguồn gốc chỉ gọi exit
tại toplevel, trái ngược với các hàm bên trong, thì bạn có thể thay đổi exit
thành return
. Bạn có thể làm điều đó mà không cần sửa đổi tập lệnh bằng cách sử dụng bí danh.
#! /bin/ksh
echo "prova"
alias exit=return
. ./second.sh
echo "ho lanciato il secondo"
. ./third.sh
unalias exit
echo "ho lanciato il terzo"
Nếu exit
cũng được gọi là các hàm bên trong, tôi không nghĩ có một cách không cồng kềnh. Một cách rườm rà là đặt bẫy thoát và đặt mã của bạn ở đó.
#!/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
.
lệnh, nguồn này cung cấp một tệp khác trong shell hiện tại. Không có vỏ con hoặc vỏ con liên quan. Bạn có nghĩa là để thực hiệnsecond.sh
vàthird.sh
thay vì tìm nguồn cung ứng chúng?