如何在不退出脚本本身的情况下取消脚本内的命令?

如何在不退出脚本本身的情况下取消脚本内的命令?

当运行某些行对于脚本完成来说不太重要的脚本时,如何取消特定命令而不终止整个脚本?

通常我会调用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
...

foo执行函数直到按下Ctrl+ 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.'

相关内容