10

我找不到我的问题的答案。在使用 ^C 退出当前命令/bash 脚本后,我需要能够执行 shell 命令/bash 脚本。

换句话说:我有一个正在运行的脚本,就在我从中 ^C 之后,我希望另一个脚本或命令在之后立即启动。如何做到这一点?

我试过./first.sh; echo something没有运气。

我可以尝试同时运行脚本,其中一个将等待/侦听另一个完成,然后执行清理命令并退出。但是我需要一种在一个命令中启动它们的方法。

解决这个问题最合适的方法是什么?

谢谢

编辑: 我想我已经明白了......从第一个脚本我可以在最后用 & 启动另一个脚本,这样它就可以进入后台。似乎与 ^C 从第一个退出一起工作(第二个连续工作)。关于更好的解决方案的任何建议?

4

3 回答 3

8

./script1.sh && ./script2即如果第一次成功,则执行第二次。

./script1.sh || ./script2即如果第一次不成功,则执行第二次。

或者在 script1 中,您可以捕获退出信号并生成第二个进程。像这样的东西:

s1:

#!/bin/bash

trap "./s2.sh" SIGINT

echo "hello"
sleep 100

s2:

#!/bin/bash

echo "goodby"

会议:

$ ./s1.sh 
hello
^Cgoodby
于 2012-08-29T09:59:11.300 回答
4

你需要的东西:

  1. 您需要捕获 sigint (ctrl-c),因此当您按下 ctrl-c 时脚本不会完成
  2. 命令执行完毕后,需要查看执行完毕的原因。如果命令被SIGINT(信号 2)中断,则该命令的退出代码将为 130 (128 + 2)。

你这样做:

trap "echo ctrl c was pressed" SIGINT
sleep 100
[ "$?" = 130 ] && echo "you've interrupted the previous command with ctrl-c"

例子:

$ bash 1.sh
^Cctrl c was pressed
you've interrupted the previous command with ctrl-c
于 2012-08-29T09:58:43.843 回答
2

Bash 初学者指南第 12 章。捕捉信号

这是一个非常简单的示例,从用户那里获取 Ctrl+C,然后打印一条消息。当你试图在没有指定 KILL 信号的情况下终止这个程序时,什么都不会发生:

#!/bin/bash
# traptest.sh

trap "echo Booh!" SIGINT SIGTERM
echo "pid is $$"

while :           # This is the same as "while true".
do
        sleep 60  # This script is not really doing anything.
done
于 2012-08-29T10:08:59.707 回答