シェルスクリプトを一時停止するには任意のキーを押し、再起動するにはもう一度押します。

シェルスクリプトを一時停止するには任意のキーを押し、再起動するにはもう一度押します。

私はファイルをコピーし、各ファイルの後に進行状況をエコーするAPIをテストするためのシェルスクリプトを書いています。

各コピーの間に2秒の待ち時間があるので、より深いテストのために任意のキーを押してスクリプトを一時停止する機能を追加したいと思いました。その後、任意のキーを押して復元します。

できるだけ少ない行にどのように追加できますか?

答え1

スクリプトに何も追加する必要はありません。シェルはこれらの機能を可能にします。

  • 端末でスクリプトを起動します。
  • 実行中に端末の使用をブロックするctrl- z。端末が再び解放され、プロセスが停止したことを示すメッセージが表示されます。 (現在進行中の状態T、中止)
  • 今あなたが望むようにしてください。ctrl- を使用して他のプロセス/スクリプトを開始および停止することもできますz
  • jobs端末に入力するか停止したすべてのジョブを一覧表示します。
  • スクリプトを続行するにはfg(foreground)と入力します。ジョブをフォアグラウンド・プロセス・グループに復元し、ジョブは引き続き実行されます。

例を見てください。

root@host:~$ sleep 10 # sleep for 10 seconds
^Z
[1]+  Stopped                 sleep 10
root@host:~$ jobs # list all stopped jobs
[1]+  Stopped                 sleep 10
root@host:~$ fg # continue the job
sleep 10
root@host:~$ # job has finished

答え2

スクリプト内に残っている間にスクリプトを一時停止するには、スリープの代わりに読み取りを使用できます。

あなたはそれを使用することができます

read -t
read -nスクリプトを続行するには、1文字を読むように読み取りタイムアウトを設定します(実際には任意のキーを押すだけです)。

まだコードを提供していないので、使用方法の例は次のとおりです。
qを押すread -n1と、キーが押されるまでスクリプトは続行しません。
キーを押すとチェックがリセットされ、スクリプトは通常どおり繰り返されます。

while [[ true ]]; do
    read -t2 -n1 check
    if [[ $check == "q" ]];then
        echo "pressed"
        read -n1
        check=""
    else
        echo "not pressed"
    fi
echo "Doing Something"
done

入力が画面出力を複雑にするのを防ぐために、stty -echoセクションの先頭と末尾に追加することもできます。stty echo

答え3

これにより、ddファイルから個々のバイトを確実に読み取ることができます。端末の読み取りと出力を10分の1秒に制限するようにバイト数をstty設定できます。私は2つをまったく使用せずに組み合わせて、端末の読み取り時間制限があなたのために機能するようにしておくことができると思います。mintimesleep

s=$(stty -g </dev/tty)
(while stty raw -echo isig time 20 min 0;test -z "$(
dd bs=1 count=1 2>/dev/null; stty "$s")" || (exec sh)
do echo "$SECONDS:" do your stuff here maybe                             
   echo  no sleep necessary, I think                                                          
   [ "$((i+=1))" -gt 10 ] && exit                                                             
done       
) </dev/tty

while以下は、試してみるために私が作成した小さなサンプルループです。 2秒ごとにdd読み取り試行stdin(からリダイレクト/dev/tty)がタイムアウトし、whileループが繰り返されます。それ以外dd いいえキーを押してタイムアウトしました。この場合、対話型シェルが呼び出されます。

これはテスト実行です。各行の先頭に印刷された数字はシェル変数の値です$SECONDS

273315: do your stuff here maybe
no sleep necessary, I think
273317: do your stuff here maybe
no sleep necessary, I think
273319: do your stuff here maybe
no sleep necessary, I think
273321: do your stuff here maybe
no sleep necessary, I think
sh-4.3$ : if you press a key you get an interactive shell
sh-4.3$ : this example loop quits after ten iterations
sh-4.3$ : or if this shell exits with a non-zero exit status
sh-4.3$ : and speaking of which, to do so you just...
sh-4.3$ exit
exit
273385: do your stuff here maybe
no sleep necessary, I think
273387: do your stuff here maybe
no sleep necessary, I think
273389: do your stuff here maybe
no sleep necessary, I think
273391: do your stuff here maybe
no sleep necessary, I think
273393: do your stuff here maybe
no sleep necessary, I think
273395: do your stuff here maybe
no sleep necessary, I think
273397: do your stuff here maybe
no sleep necessary, I think

関連情報