スクリプト自体を終了せずにスクリプト内でコマンドをキャンセルするにはどうすればよいですか?

スクリプト自体を終了せずにスクリプト内でコマンドをキャンセルするにはどうすればよいですか?

スクリプトの完了に重要ではない特定のスクリプト行を実行するときにスクリプト全体を終了せずに特定のコマンドをキャンセルするにはどうすればよいですか?

Ctrl通常 + を呼び出しますcが、このスクリプトでこれを行うと、スクリプト全体が早く終了します。現在のコマンドに対してのみCtrl+を許可する方法(スクリプト内に配置されたオプションなど)はありますか?c

いくつかの背景知識:~/.bash_profile実行中のssh-add項目がありますが、キャンセルした場合は、ssh-add「エラー130」が表示された後にエコラインを表示して、接続が確立される前に手動で実行するように思い出させたいと思います。

答え1

私の考えでは、あなたはトラップを探していると思います。

trap terminate_foo SIGINT

terminate_foo() {
  echo "foo terminated"
  bar
}

foo() {
  while :; do 
    echo foo
    sleep 1
  done
}

bar() {
  while :; do 
    echo bar
    sleep 1
  done
}

foo

出力:

./foo
foo
foo
foo
^C foo terminated # here ctrl+c pressed
bar
bar
...

fooCtrl+を押すまで関数を実行してCから実行を続けます。この場合は関数ですbar

答え2

#! /bin/bash

trap handle_sigint SIGINT

ignore_sigint='no'

handle_sigint () {
        if [ 'yes' = "$ignore_sigint" ]; then
                echo 'Caught SIGINT: Script continues...'
        else
                echo 'Caught SIGINT: Script aborts...'
                exit 130 # 128+2; SIGINT is 2
        fi
}

echo 'running short commands...'
sleep 1
sleep 1

ignore_sigint='yes'
echo 'running long commands...'
sleep 10
ignore_sigint='no'
echo 'End of script.'

関連情報