web-dev-qa-db-ja.com

トラップ 'Ctrl + c'はbashスクリプト用ですが、このスクリプトで開いているプロセス用ではありません

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

my_program

そして、私はそれを「Ctrl + c」で閉じることができることを望みます。しかし、それを実行すると、スクリプトも終了します。

私は知っています。

trap '' 2
my_program
trap 2

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

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

編集:例を追加

#!/bin/bash
my_program
my_program2

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

11
bob dylan

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
13
mosvy

アクション引数としてトラップコマンド-を指定すると、トラップをデフォルトにリセットできます。 サブシェル でこれを行うと、親シェルのトラップには影響しません。スクリプトでは、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
.
.
.
12
Mark Plotnick