BASH-陷阱CTRL + C-您确定提示并非总是有效

时间:2019-07-08 16:17:17

标签: bash ctrl bash-trap

我在bash脚本的顶部添加了以下内容:

quit() {

echo "Do you want to quit ? (y/n)"
  read n
  if [ "$n" = 'y' ]; then
    exit
  fi

}

trap quit INT
trap quit SIGINT
trap quit SIGTERM

该脚本向用户询问一系列问题,然后根据结果执行操作。在某些时候,按CTRL + C似乎可行。

但是其他时候我只得到Do you want to quit ? (y/n)并且脚本被锁定。在IF语句中或WHILE / DONE中可能会发生这种情况。

但是似乎如果您在发生回声时给CTRL + C计时,我可以解决这个问题。即:与回声同时出现的CTRL + C。

有没有一种方法可以始终捕获CTRL + C并提示用户?然后让他们决定是否要退出?

此代码显示了发生的问题。

quit() {

echo "Do you want to quit ? (y/n)"
  read n
  if [ "$n" = 'y' ]; then
    exit
  fi

}

trap quit INT
trap quit SIGINT
trap quit SIGTERM

for i in `seq 1 50`; do
    sleep 1
    echo -e "........"
    read -i "0000" -e site
done

尝试为CTRL + C计时,就像在屏幕上显示“ ........”和0000一样,发生问题。

这似乎有很大的不同。

quit() {

    while read -e -t 0.1; do : ; done
    read  -p "Do you want to quit ? (y/n) " n
    if [ "$n" = 'y' ]; then
        exit
    fi

}

我正在努力做到这一点。

谢谢

2 个答案:

答案 0 :(得分:0)

陷阱名称不能以SIG为前缀,因为它是未定义的。

您要在陷阱处理程序中执行的另一件事是: 消除陷阱 因此它们不会在处理程序处理时触发。

#!/usr/bin/env sh

quit() {
  trap false ABRT INT # Neutralize traps in the quit handler by assigning the false function
  printf '\nDo you want to quit ? (y/N)\n' # Uppercase N show the default choice
  read -r n
  case "${n}" in
    [yY]) # Match y or Y
      exit
    ;;
  esac
  trap quit ABRT INT # Re-enable traps on self
}

trap quit ABRT INT # Attach the SIGABRT and SIGINT traps to the quit function
i=1
while true; do
  echo "$i"
  i=$((i+1))
  sleep 1
done

样品运行:

1
2
^C
Do you want to quit ? (y/n)
n
3
4
^C
Do you want to quit ? (y/n)
^C5
6
7
8
^C
Do you want to quit ? (y/n)
y

答案 1 :(得分:0)

尝试以下操作。

quit() {

  echo "Do you want to quit ? (y/n)"
  read n
  if [ "$n" = 'y' ]; then
    exit
  fi

}

trap quit INT
trap quit SIGINT
trap quit SIGTERM

for i in `seq 1 50`; do
    sleep 1
    echo -e "........"
    site=$(read -p "0000" -e site; echo "$site")
done