在循环中睡眠后的Bash行为接收SIGTSTP

时间:2016-10-08 05:19:38

标签: linux bash shell loops signals

我有一个bash脚本sleep_loop.sh

#!/bin/bash
for a in $(seq 1 100)
do
    sleep 1000
done
echo after_loop

现在我使用命令bash sleep_loop.sh运行此脚本。然后我打开另一个终端,获取sleep进程的PID并将其存储在pid_of_sleep中,然后运行kill -SIGTSTP $pid_of_sleep。结果是作业bash sleep_loop.sh暂停在原始shell中(可以使用fg恢复),如预期的那样。

但是,如果我使用bash -i sleep_loop.sh运行脚本,以便执行脚本的bash处于交互模式,并重复上述步骤将SIGTSTP发送到sleep进程,则整个脚本终止之前的原始终端回声after_loop。因此,似乎在sleep退出SIGTSTP后,运行脚本的bash会突然出现。

以下是我的问题:

(1)在sleep收到SIGTSTP后,是什么原因导致bash在交互式和非交互式模式下表现不同?

(2)在交互模式下,为什么在sleep收到SIGTSTP之后,即使脚本不包含任何break,bash也会在没有终止整个脚本的情况下突破循环声明?

0 个答案:

没有答案