Зателефонуйте до іншого сценарію, але не виходьте з батьків, якщо дитина викликає вихід


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 $?

Якщо second.shвиявляється помилка і виходить зі статусом -9, first.shвиходить завжди. Як я можу уникнути виходу з першої оболонки, якщо дочірня оболонка виходить?

Я не можу редагувати second.sh.


Тут ви використовуєте .команду, яка виводить інший файл у поточну оболонку. Ніякої дочірньої оболонки чи передплати не залучено. Ви мали на увазі стратити second.sh і third.shзамість них джерела?
Селада

так .. я повинен писати Execute замість. ./? я хочу ігнорувати "вихід $?" всередині second.sh .. можна без редагування second.sh?
користувач3589887

Відповіді:


13

Що ви тут робите, це включення 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"

Якщо вам потрібні інші скрипти для доступу до змінних та функцій з оригінального сценарію, але не змінюють їх, тоді зателефонуйте до цих скриптів у підрозділах. Абонементи - це окремі процеси, тому 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

Саме тому я перестав використовувати "." джерело файлів у сценарій та намагайтеся використовувати виключно 'source'. ІМО, який слід вважати "найкращою практикою", тому що він робить більш зрозумілим, що робить ваш код.
Марк Е. Гамільтон

6

Замість пошуку другої та третьої оболонки просто запустіть їх, як і будь-яка інша команда. Код виходу можна зберігати та використовувати, якщо вам потрібно:

#! /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=$?отримає результат раніше виданої команди echo, яка не залежить від результату ./second.sh.
Cromax

@Cromax ви абсолютно праві. Відповідь відредаговано.
Дейл Андерсон

0

Спробуйте так (видаліть спочатку .під час дзвінка 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 $?

Це пояснюється тим, що .це короткий код, через sourceякий другий скрипт включається до складу першого.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.