CTRL+C を押してもコマンドが停止しないようにする

CTRL+C を押してもコマンドが停止しないようにする

そこで、Zork 1 をプレイしていて、友人に見せるためにテキストをコピーしようとしたのですが、誤ってCTRL+ を押すときに Shift キーを押し続けるのを忘れてしまいましたC。これによりコマンドが停止し、Zork データが失われました...

CTRL+キーを押したときにコマンドが停止しないようにするために使用できる「役立つ」ヒントはありますかC?

Zork はターミナル内で実行されることに注意してください。これはターミナルベースのゲームで、さまざまなアクションを実行するためのコマンドを発行します。

答え1

CTRL+ は、フォアグラウンドのジョブにC割り込み信号 ( SIGINT、信号番号 2) を送信します。trap '' 2Zork を起動する前に コマンドを使用して信号を「トラップ」することで、これを無効にすることができます。

CTRLで+ C(untrap SIGINT)を再度有効にしますtrap 2

ヒント: 次のような内容を追加できます~/.bashrc:

alias zork="(trap '' 2 && cd ~/path/to/zork/ && frotz ZORK1.DAT)"

zorkこうすることで、信号を無効にしたり再度有効にしたりすることを忘れることがなくなり、ターミナルに入力するだけでゲームを簡単に開始できるようになります。

注記: より便利な場合は、番号の代わりに信号名を使用できます (つまり、trap '' sigintまたは ) trap '' int。私は、 などのように番号を使用することに慣れていますkill -9

答え2

キーの組み合わせCtrl+はC文字^C(バイト値3)を送信します。これにより、端末はシギントフォアグラウンドで実行中のプログラムにシグナルを送ります¹。このシグナルの通常のアクションは、現在のコマンドを中断することです。連続したコマンドを処理するように設計されたプログラムはトップレベルのプロンプトに戻り、単一のバッチ コマンドまたは連続的な対話として設計されたプログラムは終了します。明らかに、使用しているプログラムは 2 番目のモデルに従って設計されています。

このシグナル送信キーは、カーネル内の一般的な端末インターフェースの機能であり、すべての端末エミュレータと実際の物理端末で共有されます。どのキーがこのシグナルを送信するか、および他のキー(特にCtrlZ送信)を設定できます。シグナルストップフォアグラウンドプログラムを一時停止する)sttyコマンド。SIGINT のキーをCtrl+に切り替えるには_(現在の端末で):

stty intr '^_'

完全に無効にするには:

stty intr ''

すべての設定をデフォルトにリセットするには:

stty sane

キーは任意のキーの組み合わせにはできず、1 バイトの値である必要があります。設定はsttyプログラムによって上書きされる可能性があります。一部のプログラム (特に全画面テキスト モード プログラム) は独自のキーボード ショートカット処理を行います。

¹ より正確に、すべてのプロセスに前景 プロセスグループ端末は制御端末

関連情報