このスクリプトで開いているプロセスではなく、bashスクリプトの「Ctrl + c」をトラップします


11

私はbashスクリプトでインタラクティブなプログラムをしようとしました:

my_program

そして、「Ctrl + c」でそれを閉じたいと思います。しかし、それを実行すると、スクリプトも終了します。

私は知っています。

trap '' 2
my_program
trap 2

しかし、この場合、my_programCtrl + cで閉じることができません。

プログラムでCtrl + cを許可し、実行中のスクリプトを閉じない方法はありますか?

編集:例を追加

#!/bin/bash
my_program
my_program2

Ctrl + cを使用して閉じるとmy_programmy_program2スクリプト全体が終了するため実行されません。

回答:


13

trap true 2またはのtrap : 2代わりにを使用してくださいtrap '' 2。それが、bashシェルの「ヘルプトラップ」が言っていることです。

ARGがNULL文字列の場合、各SIGNAL_SPECは、シェルおよびシェルが呼び出すコマンドによって無視されます

例:

$ cat /tmp/test
#! /bin/sh
trap : INT
cat
echo first cat killed
cat
echo second cat killed
echo done
$ /tmp/test
   <press control-C>
^Cfirst cat killed
   <press control-C>
^Csecond cat killed
done

2
どのように殺害についてtail次の時間を秒の代わりに猫を殺しますか?
kubanczyk 2018

12

トラップをデフォルトにリセットするには、trapコマンド-をアクション引数として指定します。これをサブシェルで実行しても、親シェルのトラップには影響しません。スクリプトでは、Ctrl-Cで割り込み可能にする必要がある各コマンドに対してこれを行うことができます。

#!/bin/bash
# make the shell (and its children) ignore SIGINT
trap '' INT
.
.
.
# but this child won't ignore SIGINT
(trap - INT; my_program)
# the rest of the script is still ignoring SIGINT
.
.
.

1
受け入れられた答えはおそらくシェルにとってより良く、より標準的ですが、これはこの種の信号マスキング/無視を安全に行う方法の一般的な原則(シェル固有ではない)を紹介するという点でそれ自体素晴らしい答えです。
R .. GitHub ICE HELPING ICEを停止

exec my_programサブシェルで少し効率的にすることができると思います。
Toby Speight 2018

@R ..これは絶対にシェル固有ではありません-シグナルをSIG_IGNに設定すると(空の文字列を持つトラップが行うことです)、SIGCHLDを除き、その状態はexec()を通じて継承されます。それはPOSIXの必須の動作です。stackoverflow.com/questions/32708086/…
mosvy

@mosvy:私のコメントのどの部分に同意しないかわかりません。私の全体的な要点は、「forkの前にマスク/無視、execの前に子のマスクを解除/無視」が、シェルプログラミングのコンテキスト外で知るのに役立つ一般的な原則であるということでした。
R .. GitHub ICEのヘルプを停止

1
これは非常に便利な答えです。経験豊富なLinuxユーザーとして、私はこれについてこれまで聞いたことがありません。それはかなり多くの用途があります...あなたは私の賛成票と私のブックマークを得ました。
Dev

-1


Crtl+ を使用すると、プログラムC中断します( " kill "します)。
おそらく探しているのは、プログラムを一時停止することです(「一時停止」してください)。これには、Crtl+ を使用できますZ
プログラムが一時停止すると、を使用してプログラムを表示できますjobs。例:
[1]+ Stopped ./foobar
ここでは、ジョブ#1の1つのジョブしかありませんが、複数ある場合があります-各ジョブには独自の番号があります。
あなたは、たとえば、コマンドの数を使用してプロセスを中断し制御することができbgfgそしてkill
bg %1ジョブ#1を再起動しますB ackのグラムラウンド
fg %1意志の再起動でジョブ#1 のF鉱石グラムのラウンドは
kill %1仕事#1殺す
あなたが使用できることに注意してくださいbgfgあなたが唯一のアクティブなジョブを持っている場合、引数なしでを。


ありがとう、いいえ、Ctrl + cを実行します。
ボブディラン2018
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.