return
закрывает исходные скрипты (и функции).
В вашем случае:
while getopts ":t:" opt; do
case $opt in
t)
timelen="$OPTARG"
;;
\?) printf "illegal option: -%s\n" "$OPTARG" >&2
echo "$usage" >&2
return 1
;;
:) printf "missing argument for -%s\n" "$OPTARG" >&2
echo "$usage" >&2
return 1
;;
esac
done
Пример теста:
$ cat script1.sh
echo script1
source./script2.sh
echo script1 ends
$ cat script2.sh
echo script2
while true; do
return
done
echo script2 ends
$ bash script1.sh
script1
script2
script1 ends
Также источник script2.sh
работает правильно (без выхода из текущего сеанса оболочки):
$ source script2.sh
script2
Ваша команда сработала, но поскольку задание остановлено, оно не ответило на сигнал.
Из вашего примера, где это не сработало, попробуйте продолжить процесс с помощью fg
или bg
или принудительно завершите процесс с помощью kill -SIGKILL %1
, и он завершится.
kill %1
работает сразу в bash и zsh, потому что это встроенная команда в этих оболочках и отправляет SIGCONT
в дополнение кSIGTERM
(или указанному сигналу ).