Bashスクリプトでインタラクティブプログラムを作成しようとしています。
my_program
「Ctrl+c」で閉じたいです。ただし、これによりスクリプトも閉じます。
わかりました。
trap '' 2
my_program
trap 2
my_program
ただし、この場合はCtrl + cで閉じることはできません。
プログラムでCtrl + Cを許可しますが、それを実行するスクリプトを閉じない方法をご存知ですか?
編集:例を追加しました。
#!/bin/bash
my_program
my_program2
my_program
Ctrl + cを使用して閉じると、my_program2
スクリプト全体が終了するため実行されません。
答え1
代わりにtrap true 2
orを使用する必要があります。これはbashシェルの「ヘルプトラップ」に記載されています。trap : 2
trap '' 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
bg
fg
kill
bg %1
雨確認するGラウンドは
fg %1
タスク#1を再開します。F鉱石Gラウンドは
kill %1
タスク#1を終了します。アクティブなジョブが1つしかない場合とパラメータなしで
使用できます。bg
fg