2016-05-24 2 views
1

私はいくつかの仕事をするスクリプトを持っています。これは適切な方法で行いますが、終了するまでにはしばらく時間がかかります。私は "ジョブが今実行中"であることをシミュレートしたいので、私はスピナーカーソルアニメーションを追加しました。シェルスクリプトでCtrl + Cを押したときにプロセスをキャンセルするにはどうすればいいですか?

私はその後、私は変数にその関数のPIDを割り当てて、すべてが行われたときに、私は単純にアニメーションを停止するためにそれを殺す、私のスクリプトの先頭にそれを呼び出します。

#!/bin/bash 

spinner & 
SPINNER_PID=$! 

# a lot of stuff going on here... 
# takes some time to finish 

kill $SPINNER_PID &>/dev/null 

printf "All done" 

関数の定義:私は中断しない場合

spinner() { 
    local i sp n 
    sp='/-\|' 
    n=${#sp} 
    while sleep 0.1; do 
    printf "%s\b" "${sp:i++%n:1}" 
    done 
} 

すべてが正常に動作します。

は私がControl+Cを呼び出すことによって、私の長いタスクをキャンセルすることを想像してみてください。これはキャンセルされますが、スピナーはまだ無限ループであることに気付いているので、明らかにアニメーション化されます。スクリプトを手動でキャンセルされ、kill $SPINNER_PID &>/dev/nullに達しないとき、私はそれを殺すことができますどのように

enter image description here

答えて

3

Ctrl-Cが押されたときにコードを実行することができますtrap呼び出したステートメントがあるようです。そこにhereの良い説明があり、そしてthis websiteCtrl-C上で機能を実行する方法について説明します。

trap your_func INT 
+0

パーフェクト!ありがとうございました。私はこの問題を解決しました。 – slick

+0

大歓迎です! – frenchDolphin

関連する問題