${!}は何を返しますか? [コピー]

${!}は何を返しますか? [コピー]

私が持っているスクリプトでは

trap 'kill ${!}; term_handler' SIGTERM

したがって、pid $ {!}を終了すると、SIGTERMが実行されます。

答え1

または、最後に実行されたコマンドを返す必要が${!}あります$!process ID (PID)

!- 最後に実行されたバックグラウンド(async)コマンドのプロセスIDに展開されるため、最後のバックグラウンドジョブのプロセスIDが$!含まれます。process ID (PID)

これはバックグラウンドで実行されるプログラムを表します。バックグラウンドプロセスが開始されない場合、このパラメータは設定されません。

答え2

$!または、${!}バックグラウンドで実行されている最後のプロセスのプロセスIDを返します。

例:wait $! 続行する前に、最後のプロセスが完了するのを待ちます。

答え3

trap 'kill ${!}; term_handler' SIGTERM

kill ${!}; term_handlerこれは、シェルがSIGTERM信号を受信するとシェルコマンドが実行されることを意味します。${!}はい特殊パラメータ$!、どちら

($!)は、非同期コマンドとして実行されるか、bg組み込みコマンドを使用して最後にバックグラウンドに追加されたジョブのプロセスIDに展開されます。

スクリプトがSIGTERMを受信して​​実行term_handler(おそらくいくつかの機能)すると、スクリプトによって開始された最後の(おそらく唯一の)バックグラウンドプロセスが終了するという効果があります。トラップが存在しない場合は、基本スクリプトが終了した後もバックグラウンドプロセスが実行され続けることがあります。

たとえば、トラップは特にSIGTERM関連していますが、SIGINTそうでなければSIGHUP通常のシャットダウンはトリガされません。少なくともBashでは利用可能です

trap 'kill ${!}; term_handler' EXIT

何らかの理由でスクリプトが終了したら、トラップを実行します。

関連情報