BASH pause readline sur SIGINT
Question
J'ai essayer d'attraper un SIGINT ctrl+c à l'intérieur d'une lecture en boucle sur un socket mais la pause, je vous demande seulement de traiter après une nouvelle ligne.Alors, quand je ctrl+c mon application, je dois attendre pour une nouvelle ligne d'arriver dans le support avant la boucle pauses / l'application quitte
C'est le minimum de la version :
trap "break" SIGINT SIGHUP SIGTERM
exec 3<>/dev/tcp/192.168.1.84/50885
while read line
do
echo -e "$line\n"
done <&3
Comment puis-je immédiatement interrompre la boucle et de quitter l'application?
La solution
Un break
n'est pas un vrai de commande, vous pouvez exécuter les où vous voulez;c'est simplement une construction syntaxique pour marquer un point où laisser entouré d'une boucle.Votre break
n'a pas entouré d'une boucle, de sorte qu'il n'a pas de sens (et c'est une erreur: bash: break: only meaningful in a `for', `while', or `until' loop
).
Vous devez tuer le read
commande au lieu de:
trap "killRead" SIGINT SIGHUP SIGTERM
killRead() {
kill $(cat /tmp/read.pid)
}
exec 3<>/dev/tcp/192.168.1.84/50885
while read line
do
echo -e "$line\n"
done <&3 & pid=$!
echo $pid > /tmp/read.pid
wait $pid
Bien sûr, ce n'est qu'une très brut de solution, pas de masquer les messages d'erreur émis par résilié sous-coquille etc.Mais il montre que l'idée et permet de résoudre le problème vous m'avez demandé.Pour cacher prévu message d'erreur etc.vous voudrez peut-être poser d'autres questions (ou juste la recherche pour déjà donné les réponses ici ;-)