以下是演示我的问题的脚本。它工作除了我按下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.
答案 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"