Почему при использовании bash и приостановке цикла while цикл возобновляется после возобновления? Краткий пример ниже.
$ while true; do echo .; sleep 1; done
.
.
^Z
[1]+ Stopped sleep 1
$ fg
sleep 1
$
Я знаком с сигналами, и я предполагаю, что это может быть естественным поведением bash, но я бы хотел лучше понять, почему он ведет себя именно так.
bash
shell
signals
background-process
bkzland
источник
источник
$?
возврате, и этоtrue
не такtrue
. наверное. думаю.Ответы:
Это похоже на ошибку в нескольких оболочках, она работает как положено с ksh93 и zsh .
Задний план:
Кажется, что большинство оболочек запускают цикл while внутри основной оболочки и
Bourne Shell приостанавливает всю оболочку, если вы наберете ^ Z с оболочкой без входа в систему
bash приостанавливает только
sleep
функцию и затем покидает цикл while в пользу печати нового приглашения оболочкитире делает эту команду невыполнимой
С ksh93 все работает совсем иначе:
ksh93 делает то же самое, в то время как команда запускается в первый раз, но, как
sleep
и buitin в ksh93, ksh93 имеет обработчик, который заставляет цикл while отключаться от основной оболочки, а затем приостанавливается в тот момент, когда вы вводите ^ Z.Если вы введете ksh93 позже, дочерний элемент
fg
, который все еще выполняет цикл, будет продолжен.Вы видите основное отличие при сравнении сообщений jobcontrol от bash и ksh93:
Bash сообщает:
[1]+ Stopped sleep 1
но ksh93 сообщает:
^Z[1] + Stopped while true; do echo .; sleep 1; done
Zsh ведет себя подобно ksh93
В обеих оболочках у вас есть один процесс (основная оболочка), если вы не вводите ^ Z, и два процесса оболочки после ввода ^ Z.
источник
dash
самом деле не обрабатывает сигнал, когда цикл заканчивается? в[d]?ash
исходном коде все эти макросы для INTON и INTOFF разбросаны по всему, и обычно сигналы, принимаемые в состоянии INTOFF, действительно обрабатываются в (или вокруг) INTON . в любом случае, мне только любопытно, потому что я думаю, что ты знаешь лучше - это отличный ответ. Спасибо.sleep 100
может быть приостановлен и возобновленdash
, поэтому, похоже, онdash
знает о проблемах в этой команде и выборочно отключает управление заданиями.dash
производительность других оболочек, отбросив многобайтовую обработку? и да,dash
поддерживает ли управление заданиями, но стандарт говорит, что интерактивная оболочка должна игнорировать TSTP, и выполнение цикла while в текущей оболочке на интерактивном терминале является не менее интерактивной оболочкой, чем любая другая.Я написал одному из соавторов Bash об этой проблеме, и вот его ответ:
Поэтому, если кто-то хочет отправить патч, используйте адреса электронной почты, найденные на страницах руководства.
источник