5

Не могли бы вы объяснить, почему Ctrl+C в моей оболочке bash влияет на команду, которая ранее выполнялась в фоновом режиме с помощью:

`./my_script.sh 1` &

Команда сразу заканчивает выполнение кодом 130 :

[1]+  Exit 130              `./my_script.sh 1` &

Обычное поведение Ctrl+C - убить процесс переднего плана. И что здесь происходит?

Редактировать 1: (мои мысли) может быть что-то, связанное с обратными галочками - здесь начинается дочерний процесс подоболочки и он каким-то образом получает Ctrl+C, когда родительский процесс получает его

Изменить 2: я обнаружил, что Ctrl+C останавливает все фоновые процессы, которые были запущены из текущей оболочки с использованием обратных галочек.

1 ответ1

1

Когда вы пишете команду

`./my_script.sh 1` &

Вы делаете замену команды (см. ниже).
Практически вы выполняете подоболочку (ту, что для обратных символов ``) в фоновом режиме (&), в которой он запускает ваш скрипт (./my_script.sh 1).

Нынешняя оболочка ожидает окончания выполнения своей подоболочки, чтобы запустить ее вывод в виде команд.
Подоболочка ждет конца вашего сценария.
Когда вы нажимаете Ctrl+C, вы прерываете это ожидание, передавая сигнал SIGINT ребенку.

В этот момент текущая оболочка пытается выполнить в качестве команды вывод, полученный до сих пор ... и генерирует ошибку 130 что означает «Сценарий завершен с помощью Control-C» [ 2 ].


С помощью обратных символов `` , а также с $() в bash вы выполняете подстановку команд [ 1 ]:

Bash выполняет расширение, выполнив COMMAND и заменив подстановку команды стандартным выводом команды, с удалением всех завершающих строк новой строки.

например

echo `date`   
Thu Feb 6 10:06:20 CET 2003 

Обратите внимание, что если вы запускаете в фоновом режиме больше таких команд

`./myscript 1` &
`./myscript 2` &
`./myscript 3` &

это всегда текущая оболочка, которая ожидает всех выходных данных дочерних элементов. Один Ctrl+C завершит это ожидание для всех вместе.

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

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .