私はファイルをコピーし、各ファイルの後に進行状況をエコーする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つをまったく使用せずに組み合わせて、端末の読み取り時間制限があなたのために機能するようにしておくことができると思います。min
time
sleep
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