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