Существует несколько вещей, которые можно сделать. Вы могли присоединить strace
к нему для наблюдения то, что это делает (вывод может быть обильным!):
strace -p [pid of cp]
или Вы могли добраться lsof
для сообщения Вы, который регистрирует его в настоящее время, имеете открытый:
lsof -p [pid of cp]
Если Вы выполняете большое рекурсивное cp
, Вы могли использовать pwdx
для получения текущего рабочего каталога, который может дать Вам некоторое представление о том, как он делает:
pwdx [pid of cp]
То, что вы здесь делаете, включает 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
Вместо того, чтобы использовать вторую и третью оболочку, просто запустите их, как любую другую команду. Код выхода можно сохранить и использовать при необходимости, например:
#! /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...
Попробуйте так (удалить первый .
при вызове 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 $?
Это потому, что .
— это шорткод для источника
, который позволяет включить второй скрипт как часть первого.
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
Надеюсь, это поможет.