シェルスクリプトの実行時に現在の段落をスキップするターミナルキーの入力/組み合わせ

シェルスクリプトの実行時に現在の段落をスキップするターミナルキーの入力/組み合わせ

私はDebianとLinuxでbashスクリプトを頻繁に実行します。

私たちは皆、CTRL + Cキーの組み合わせが現在のプログラムを中断して実行可能ファイル/スクリプトを閉じることができることを知っていますが、このキーストロークはバッチ/スクリプトを完全に終了します。

私が探しているのはキーストロークです非常に実用的な段落に対してのみスキップ(入れ子になったCTRL + Cなど)段落を実行しなくても、forループの「break」や「continue」と同様にエラー条件が発生します。

スクリプト例:

デモファイル

wget http://something_from_the_internet...
unzip that_file
ping my_host
4th passage...
5th passage...

キーの組み合わせを押して2番目のコマンド(この場合は解凍)に移動するか、2回押して3番目のコマンド(この場合はping ...)に直接移動します。

多くの場合、スクリプトファイルの結果はすべての段落によって提供されます。しかし、私の場合はそうではありません。テスト目的でこれらの組み合わせを使用すると、上部のすべての行にコメントを付けることなくコンテンツを実行してテストできます。一番下の最新情報を簡単に見てください。

答え1

Bashでは、実行中のプロセスを「スキップ」することはできません。 ~によるとこれBashのドキュメントページで信号のスキップ動作があっても、スキップを実行する前にプロセスの実行が完了するのを待つので、次のガイドラインのみを効果的にスキップします。ただし、バックグラウンドで実行されている間(たとえばSIGINTが受信されたとき)、解凍プロセスが自動的に終了するようにスクリプトの実行方法を変更できます(ガイド)。

答え2

SIGINTBashの内蔵機能を使用して、選択的に信号を取り込むことができますtrap

trap [COMMANDS] [SIGNALS]

たとえば、SIGINTフォアグラウンドスクリプトに送信された信号をキャプチャして、スクリプトによって生成されたプロセスに信号を送信できます。

ただし、この場合はフォークされたプロセスのPIDが必要です。 Bashの変数を使用できますが、$!これはバックグラウンドに分岐したプロセスでのみ機能します。

回避策としてスクリプトの同期特性を維持するには、wait返されたPIDを明示的に呼び出すことができます。

#!/usr/bin/env bash

function skip() {
  kill -SIGTERM $!
}

trap skip SIGINT

ping ... &
wait $!

wget ... &
wait $!

unzip ... &
wait $!

関連情報