
4つのオプションを持つ選択メニューがあります。 ctrl + cを押してプログラムを終了する前に、いくつかのファイルを削除したいと思います。これは私のコードです。
#!/bin/bash
ctrl_c() {
test -f directory/file.txt && rm directory/file.txt
}
trap ctrl_c INT
PS3='Please enter your choice: '
while true; do
clear
options=("Option 1" "Option 2" "Option 3" "Exit")
select opt in "${options[@]}"
do
case $opt in
"Option 1")
echo "you chose choice $REPLY which is $opt"
break
;;
"Option 2")
echo "you chose choice $REPLY which is $opt"
break
;;
"Option 3")
echo "you chose choice $REPLY which is $opt"
break
;;
"Exit")
break 2
;;
*) echo "invalid option $REPLY";;
esac
done
read -p "Press [Enter] key to continue..."
done
しかし、このコードを実行してCtrl + Cを押すと、何も起こらず、プログラムも終了せず、^c
内容だけが入力されます。何が問題なの?
答え1
Ctrl+ CSIGINT シグナルを送信しますが、そのシグナルをキャプチャしてctrl_c
関数に割り当てています。
trap ctrl_c INT
Ctrlしたがって、+を押すとスクリプトが終了するのではなくC関数を実行します。これが望ましくない場合は、trap
コマンドを削除してください。
関数の実行後に終了することが目標である場合は、ctrl_c
スクリプトに明示的に終了するように指示する必要があります。
ctrl_c() {
test -f directory/file.txt && rm directory/file.txt
exit
}
信号を捕捉することにより、必要に応じてプログラムが信号に応答して実行することを望むタスクを実施することができる。
posix
set -o posix
ただし、コマンドがアクティブに実行されている間はシグナルが転送されないため、シェルオプションが有効になっていないと予想通りに動作しません(「参照」)。Bashは 'select'ループが実行されたときにSIGINTトラップを無視します。")。
これは、通話set -o posix
前select
(および可能であれば通話後)を使用したい場合があることを意味します。set +o posix