ctrl+c を押してもスクリプトが終了しない

ctrl+c を押してもスクリプトが終了しない

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
}

信号を捕捉することにより、必要に応じてプログラムが信号に応答して実行することを望むタスクを実施することができる。

posixset -o posixただし、コマンドがアクティブに実行されている間はシグナルが転送されないため、シェルオプションが有効になっていないと予想通りに動作しません(「参照」)。Bashは 'select'ループが実行されたときにSIGINTトラップを無視します。")。

これは、通話set -o posixselect(および可能であれば通話後)を使用したい場合があることを意味します。set +o posix

おすすめ記事