【问题标题】:Executing subsequent command/script, after the current one was ^C执行后续命令/脚本,在当前命令/脚本之后是 ^C
【发布时间】:2012-08-29 09:50:30
【问题描述】:

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

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

我试过./first.sh; echo something,但没有成功。

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

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

谢谢

编辑: 我想我明白了... 从第一个脚本开始,我可以在末尾使用 & 启动另一个脚本,以便它进入后台。似乎与 ^C 从第一个退出一起工作(第二个连续工作)。 对更好的解决方案有何建议?

【问题讨论】:

    标签: bash shell scripting


    【解决方案1】:

    ./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
    

    【讨论】:

    • 谢谢。这显然比在后台创建监听器要好!这就是我一直在寻找的。​​span>
    • 这个解决方案并不完美,因为你无法检查,脚本中中断了什么命令。在必须启动第二个脚本之前,您很可能会中断脚本。 &&|| 语句显然也无济于事,因为非零退出代码并不意味着程序被中断。
    • 对我来说已经足够好了。我不在乎脚本在什么时候被中断,它不会影响清理脚本的行为。在我的第一个脚本中,我首先做了陷阱。如果在此之前脚本被中断,则无需清理。非常感谢。
    【解决方案2】:

    你需要的东西:

    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
    

    【讨论】:

    • 谢谢。这显然比在后台创建监听器要好!这就是我一直在寻找的。​​span>
    【解决方案3】:

    Bash Guide for Beginners Chapter 12. Catching signals

    这是一个非常简单的例子,从用户那里获取 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
    

    【讨论】:

      猜你喜欢
      • 2014-12-13
      • 2017-07-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多