10

私は自分の問題に対する答えを見つけることができません。現在のスクリプトが ^C で終了した後に、シェル コマンド/bash スクリプトを実行できるようにする必要があります。

言い換えれば、実行中のスクリプトがあり、そのスクリプトから ^C した直後に、別のスクリプトまたはコマンドをすぐに起動したいということです。これを達成する方法は?

私は./first.sh; echo something運がないことを試みました。

一方が他方の終了を待機/リッスンする同時スクリプトを実行してから、クリーンアップ コマンドを実行して終了することもできます。しかし、1 つのコマンドでそれらを起動する方法が必要になります。

この問題に対する最も適切なアプローチは何でしょうか?

ありがとう

編集: 私はそれを手に入れたと思います...最初のスクリプトから、最後に&を使用して他のスクリプトを起動できるため、バックグラウンドに移動します。最初のものから ^C exit で動作するようです (2 番目の連続動作)。より良い解決策に関する提案はありますか?

4

3 に答える 3

8

./script1.sh && ./script2つまり、1番目が成功した場合は2番目を実行します。

./script1.sh || ./script2つまり、1番目が成功しなかった場合は2番目を実行します。

または、script1で、終了信号をトラップして2番目のプロセスを生成できます。このようなもの:

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. ctrl-c を押してもスクリプトが終了しないように、sigint (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 に答える