Вызвать сценарий для другого сценария, но не выходить из родительского, если потомок сначала вызывает exit

Существует несколько вещей, которые можно сделать. Вы могли присоединить strace к нему для наблюдения то, что это делает (вывод может быть обильным!):

strace -p [pid of cp]

или Вы могли добраться lsof для сообщения Вы, который регистрирует его в настоящее время, имеете открытый:

lsof -p [pid of cp]

Если Вы выполняете большое рекурсивное cp, Вы могли использовать pwdx для получения текущего рабочего каталога, который может дать Вам некоторое представление о том, как он делает:

pwdx [pid of cp]
11
23.07.2015, 00:57
4 ответа

То, что вы здесь делаете, включает 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 в родительском скрипте, то вам нужно будет продолжать их поиск.

Встроенная команда return завершает только исходный сценарий, а не весь процесс - это одно из немногих отличий между включением другого сценария с . и включение ее текста в родительский скрипт. Если исходные сценарии вызывают только 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
13
27.01.2020, 19:57

Вместо того, чтобы использовать вторую и третью оболочку, просто запустите их, как любую другую команду. Код выхода можно сохранить и использовать при необходимости, например:

#! /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...
5
27.01.2020, 19:57

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

Это потому, что . — это шорткод для источника , который позволяет включить второй скрипт как часть первого.

0
27.01.2020, 19:57

script1.sh

  1 PWD="/scratch/currdir"
  2 echo "Hello from scrpt 1"
  3
  4 sh $PWD/script2.sh # We will exit in script2.sh and see if line 6 gets printed
  5
  6 echo "From script 1: After scrpt2 call"
  7 exit 0

script2.sh

  1 echo "Hello from script 2"
  2
  3 exit 1
  4 echo "This should not get printed"

Выход:

-bash-4.1$ sh script1.sh
Hello from scrpt 1
Hello from script 2
From script 1: After scrpt2 call

(Примечание :Хотя мы вышли из script2 (строки номер 3 с выходом 1 ), но все еще в script1.sh строка № 6 выполняется после вызова script2.sh

Надеюсь, это поможет.

0
16.12.2020, 12:01

Теги

Похожие вопросы