В не-интерактивных (, как в сценариях ), оболочки не выполняют управление заданиями. Они не переводят асинхронные задания в фоновый режим. Они остаются в той же группе процессов, что и остальная часть скрипта, поэтому Ctrl -C вызовет отправку SIGINT им также (, предполагая, что сам скрипт запущен на переднем плане ).
Вы можете выдать set -m
командную оболочку, чтобы она выполняла управление заданиями, когда -не интерактивна:
#! /bin/bash -
set -m
xcommand & # start as a background job, so won't receive SIGINT upon ^C
tail -f outputfile # start in foreground. Will receive SIGINT.
fg # bring the xcommand job in foreground and wait for it. Will receive SIGINT
Чтобы это работало, этот сценарий должен быть запущен на переднем плане. Также имейте в виду, что если вы нажмете Ctrl -Z или если фоновое задание попытается прочитать данные с терминала, у вас возникнут проблемы.
По моему опыту, такого рода приемы «работают» только в bash
или yash
, а не в других борновских -подобных оболочках.
Наконец-то я нашел причину :В репозиториях отсутствовало "основное"!! См. Правка 2