web-dev-qa-db-ja.com

BashスクリプトはCtrl + Cで終了しません

私のスクリプトはで終了できません Ctrl+C キー。エラーです。

スクリプトを変更して終了可能にする方法を説明してください Ctrl+C

#!/bin/bash

while true; do
  paplay /usr/share/sounds/phone.wav
done
3
porton

親シェルでSIGINTをキャッチしてシェルを終了すると、paplayも停止します。

trap exit SIGINT;
while true; do paplay  /usr/share/sounds/phone.wav ; done

paplayがINTシグナルをブロックしているように見えます。これは、親シェルがデフォルトのハンドラーを実行できないようにするためです。

ハンドラーをリセットしてシグナルを再発生させる親シェルにハンドラーをインストールすると、おそらくより良い方法で解決されます。

trap 'trap - SIGINT; kill -SIGINT $$' SIGINT; 
while :; do paplay  /usr/share/sounds/linuxmint-login.wav ; done 

exitアプローチでは、ランチャープロセスは子が自発的に終了したと見なしますが、2番目のアプローチでは、スクリプトがSIGINTで強制終了されたように見えます)。

4
PSkocik

質問は実際にはpaplayに関するもので、信号をブロックしている可能性があります。または( Arch Wiki で示唆されているように)単に忙しすぎる可能性があります。

sleep 1をループに入れることで、スクリプトを簡単に停止できます。

0
Thomas Dickey