Gọi một kịch bản cho một kịch bản khác, nhưng không thoát khỏi cha mẹ nếu đứa trẻ gọi thoát


11

first.sh:

#! /bin/ksh
echo "prova"
. ./second.sh
echo "ho lanciato il secondo"
. ./third.sh
echo "ho lanciato il terzo"

second.sh:

echo "sono nel secondo script"
dosomething1
exit $?

Nếu second.shphát hiện lỗi và thoát với trạng thái -9, first.shluôn thoát. Làm thế nào tôi có thể tránh thoát ra khỏi vỏ đầu tiên nếu vỏ con thoát ra?

Tôi không thể chỉnh sửa second.sh.


Ở đây bạn đang sử dụng .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ện second.shthird.shthay vì tìm nguồn cung ứng chúng?
Celada

vâng .. tôi phải viết thực thi thay vì. ./? tôi muốn bỏ qua "thoát $?" bên trong second.sh .. có thể mà không cần chỉnh sửa second.sh?
dùng3589887

Câu trả lời:


13

Những gì bạn đang làm ở đây là bao gồm second.shthird.shnhư 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.shvề cơ bản là tương đương với việc bao gồm các văn bản second.shtại thời điểm đó. Các exitlệ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.shthird.shchú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 exitchỉ 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.shthird.shtrong 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 returndự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 exittại toplevel, trái ngược với các hàm bên trong, thì bạn có thể thay đổi exitthà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 exitcũ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

Vì lý do này mà tôi đã ngừng sử dụng '.' để nguồn tệp thành tập lệnh và thay vào đó cố gắng sử dụng độc quyền 'nguồn'. IMO nên được coi là một bash 'thực tiễn tốt nhất', vì nó làm cho rõ ràng hơn những gì mã của bạn đang làm.
Đánh dấu E. Hamilton

6

Thay vì tìm nguồn cung cấp vỏ thứ hai và thứ ba, chỉ cần chạy chúng như bất kỳ lệnh nào khác. Mã thoát có thể được lưu trữ và sử dụng nếu bạn cần, như vậy:

#! /bin/ksh
echo "prova"

# execute and capture stdout ... output of second is not seen ...
OUTPUT1=$(./second.sh)

# find out exit status of second.sh
STATUS1=$?

# ... until now
echo $OUTPUT1

# do something based on the result
if [ $STATUS1 -eq 0 ]; then 
  echo "second.sh ran successfully"
else 
  echo "second.sh crapped out"
fi

# and so on...

STATUS1=$?sẽ bắt kết quả của lệnh echo đã ban hành trước đó, độc lập với kết quả của ./second.sh.
Cromax

@Cromax bạn hoàn toàn đúng. Câu trả lời đã được chỉnh sửa.
Dale Anderson

0

Hãy thử theo cách này (loại bỏ đầu tiên .khi gọi second.sh):

first.sh:

#! /bin/ksh
echo "prova"
./second.sh
echo "ho lanciato il secondo"
./third.sh
echo "ho lanciato il terzo"

second.sh:

echo "sono nel secondo script"
dosomething1
exit $?

Điều này là do .shortcode sourcekhiến cho tập lệnh thứ hai được đưa vào như một phần của tập lệnh thứ nhất.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.