无法捕获ctrl-c以退出函数退出bash脚本

时间:2017-04-21 14:40:04

标签: linux bash

以下是演示我的问题的脚本。它工作除了我按下ctrl-c后无法退出 - 它退出,但工作功能继续运行,我必须使用ps grep kill -9来摆脱这个过程。

我一直在试验这个剧本,并且发现我不能简单地杀掉工作功能而不会摆脱"终止"来自工作控制的消息。这就是为什么我陷入SIGPIPE退出函数的原因。顺便说一句,它似乎只适用于SIGPIPE,但不适用于SIGINT或INT,我不明白为什么。无论如何,我还没有找到一种方法如何在ctrl-c上中止。

谢谢!

#!/bin/bash

bail_out() { unset work; }
ctrl_c() { bail_out; exit; }

working()
{
  trap bail_out SIGPIPE
  trap ctrl_c INT
  echo -n "`tput sc`"
  # a='| / - \'
  a='.oOo oOo. Oo.o o.oO'
  work=1
  while [ "$work" ]; do
    for i in $a; do
      [ "$work" ] && echo -n "`tput rc`Working... $i"
      sleep .1
    done
 done
}

task()
{
  count=0
  while [ $count -lt "$1" ]; do
    ls -l >/dev/null
    sleep .5
    count=$((count +1))
  done
}


working &
task 10
kill -s SIGPIPE %%
echo "`tput rc`task 10 completed"

working &
f_pid=$!
task 11
kill -s SIGPIPE $f_pid
echo "`tput rc`task 11 completed"

输出:

$ ./working
task 10 completed 
task 11 completed

$ ./working
Working... .oOo^C
Working... oOo.

1 个答案:

答案 0 :(得分:3)

我终于明白了。问题显然是我在后台运行的函数中陷阱ctrl-c。将“trap ctrl_c INT”移出“工作”功能并进入主脚本解决了这个问题。

ctrl_c() { kill %%; exit; }


trap ctrl_c INT
working &
task 10
kill -s SIGPIPE %%
echo "`tput rc`task 10 completed"