Можете ли вы указать отдельную ловушку в подоболочке, созданной с помощью ()?

Я пишу скрипт, который запускает подоболочку, чтобы уйти и сделать некоторую работу. В частном случае сценарий должен сказать подоболочке, чтобы он полностью остановился на том, что он делает, и выйдет рано. Тем не менее, мой psuedo-код ниже, похоже, не работает. Я пытаюсь сделать невозможное? Можно ли определить отдельную ловушку для сигналов в подоболочке?

#!/bin/bash function myExitFunction { ... } trap myExitFunction SIGTERM while [ 1 ] ; do waitForSpecialCondition kill -0 $SUBSHELL_PID # check if subshell is running if [ $? -eq 0 ] ; then # and kill it if it is kill $SUBSHELL_PID fi ( someProcess MYOWNCHILD=$! # save someProcess's pid to kill later if I need to trap "kill $MYOWNCHILD" SIGTERM ... # do stuff ) & SUBSHELL_PID=$! done 

  • Как разрешить сценарию оболочки bash цикл для 3 повторений перед выходом (подсказка для имени пользователя / пароля)
  • как добавить дополнительный символ после поиска слова
  • Используйте системную команду вместо встроенного Bash без указания полного пути
  • Ошибка при присвоении текущей директории переменной
  • Почему ci "(изменение внутри кавычек) не работает в bash с включенным режимом vi?
  • Получение пользовательского ввода из сценария, используемого как stdin для сеанса SSH
  • Создать массив в bash с переменными как имя массива
  • Мне нужно сделать файл undeleteable, но разрешить его модификацию и переименование
  • One Solution collect form web for “Можете ли вы указать отдельную ловушку в подоболочке, созданной с помощью ()?”

    Оказывается, моя проблема не в том, что я действительно думал. Ниже приведен скрипт, который ведет себя как psuedo-код выше. Он функционирует точно так, как я ожидал (хотя и немного надуман, чтобы быть простым), и является хорошим примером наличия отдельных ловушек сигнала для процесса родительской и дочерней оболочки.

    Функцию этой ловушки можно продемонстрировать, просто запустив скрипт и выйдя на ctrl-c.

     #!/bin/bash function endEarly { echo "Terminating early" if [ ! -z $SUBSHELL_PID ] ; then echo "Killing subshell with pid $SUBSHELL_PID" kill $SUBSHELL_PID fi exit } trap endEarly SIGTERM SIGINT echo "Give me some input" while [ 1 ] ; do read INPUT # kill the subshell if it exists and is running if [ ! -z $SUBSHELL_PID ] ; then kill -0 $SUBSHELL_PID if [ $? -eq 0 ] ; then kill $SUBSHELL_PID fi fi echo "Now I'll repeat your input. Feel free to change it" echo "at any time by typing it again and hitting <Enter>" { ( while [ 1 ] ; do echo "$INPUT" sleep 5 done ) & CHILD_PID=$! trap "kill $CHILD_PID;" SIGTERM SIGINT wait $CHILD_PID } & SUBSHELL_PID=$! done 
    Linux и Unix - лучшая ОС в мире.