Bashスクリプトに対して「Ctrl + c」をキャプチャしますが、このスクリプト内で開かれたプロセスについてはキャプチャしません。

Bashスクリプトに対して「Ctrl + c」をキャプチャしますが、このスクリプト内で開かれたプロセスについてはキャプチャしません。

Bashスクリプトでインタラクティブプログラムを作成しようとしています。

my_program

「Ctrl+c」で閉じたいです。ただし、これによりスクリプトも閉じます。

わかりました。

trap '' 2
my_program
trap 2

my_programただし、この場合はCtrl + cで閉じることはできません。

プログラムでCtrl + Cを許可しますが、それを実行するスクリプトを閉じない方法をご存知ですか?

編集:例を追加しました。

#!/bin/bash
my_program
my_program2

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

答え1

代わりにtrap true 2orを使用する必要があります。これはbashシェルの「ヘルプトラップ」に記載されています。trap : 2trap '' 2

ARGが空の文字列の場合、シェルは各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

-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
.
.
.

答え3


Crtl+をC使用すると邪魔するプログラム("殺す「it)。
あなたが探しているもの停止するあなたのプログラム(」停止する「it)。これを行うにはCrtl+を使用できますZ
プログラムが一時停止すると、次のようになりますjobs。停止したプロセスを制御するために使用できるコマンドがたくさんあり、タスク#1を再起動します。
[1]+ Stopped ./foobar

bgfgkill
bg %1確認するGラウンドは
fg %1タスク#1を再開します。F鉱石Gラウンドは
kill %1タスク#1を終了します。アクティブなジョブが1つしかない場合とパラメータなしで
使用できます。bgfg

関連情報