をSIGKILL
現在のフォアグラウンドジョブに送信するキーバインドを設定するにはどうすればよいですか?私はすでにそれを知っているCtrl+がCあるSIGINT
とCtrl+ \ですSIGQUIT
。もっと厳しいオプションが欲しいです。
これについて真剣に勧められないことはありますか?
zsh
)と、質問がキーバインドについて説明しているという事実に注意していません。これはzsh
端末の設定ではなく、のラインエディタの設定に関する質問です。
をSIGKILL
現在のフォアグラウンドジョブに送信するキーバインドを設定するにはどうすればよいですか?私はすでにそれを知っているCtrl+がCあるSIGINT
とCtrl+ \ですSIGQUIT
。もっと厳しいオプションが欲しいです。
これについて真剣に勧められないことはありますか?
zsh
)と、質問がキーバインドについて説明しているという事実に注意していません。これはzsh
端末の設定ではなく、のラインエディタの設定に関する質問です。
回答:
賢明でなくても、実際には不可能です。
Control + [?]キーバインドは、シェルではなくttyドライバーによって実際に処理されます。これは、フォアグラウンドで実行されているプロセスがある限り、ターミナルの入出力がプロセスに直接転送されるためです。シェルは、キー入力に基づいて行動することはできません(または、見ることすらできません)。
現在割り当てられているCtrl + [?]キーの組み合わせのリストは、から取得できますstty -a
。ただし、intr
(SIGINT、通常Ctrl + Cにバインド)quit
(SIGQUIT、通常Ctrl + \にバインド)およびsusp
(SIGSUSP、通常Ctrl + Zにバインド)のみが実際のUNIX信号に対応します。(kill,
たとえば、SIGKILLを送信せず、現在の入力を削除します。)
残念ながら、プロセスで無効にできない2つのシグナル(SIGKILLとSIGSTOP)のいずれかを送信する方法はないため、上記の3つのシグナルのすべてが効果がない場合は、他の方法を使用する必要があります(たとえば、別のシェル)フォアグラウンドプロセスを強制終了します。
(実際には、3つの信号すべてを捕捉することに加えて、フォアグラウンドプロセスは、ttyを「raw」モードに設定することにより、そもそも特別なキーの組み合わせを無効にすることもできます。ローカルでCtrl + Cを押してリモートホストに送信します。)
はい、お勧めできません。あなたは直接信号から飛び降りSIGINT
ていSIGKILL
ます。私は、他の人がそうするように、核オプションを採用する前にSIGHUP
またはのSIGTERM
信号を送ることをお勧めします。次に、これをキーバインディングとして使用することはお勧めできません。これはもちろん、コマンドの実行中ではなく、ZLEがアクティブでシェルが入力を対話形式で要求している場合にのみ機能することを意味します。(そのためには、シェルではなく端末を構成する必要がありSIGTERM
、POSIXで指定された動作を拡張機能として送信することを実装する端末回線制御が必要になります。)
そのメモでは、ターミナルではなくシェルラインエディタのキーバインドについて尋ねていることに誰もまだ気付いていないようです。質問の最初の部分に回答するには、次のようにします。
シェル関数を設定して、「現在の」ジョブに信号を送信します。
function terminate-current-job() { kill -s TERM %+ ; }
次に、このシェル関数を呼び出すZLEユーザー定義ウィジェットを作成します。
zle -N terminate-current-job terminate-current-job
そして最後に、そのウィジェットを選択したキーにバインドします。
bindkey "^/" terminate-current-job