コマンド自体が1つのPIDを生成するのにpidofコマンドの結果を保存すると、2つのPIDが生成されるのはなぜですか?

コマンド自体が1つのPIDを生成するのにpidofコマンドの結果を保存すると、2つのPIDが生成されるのはなぜですか?

これは私のPi 4にあります。

次のコマンドを実行するとき:

#!/bin/bash
strScriptName=$(basename $BASH_SOURCE)

pidof -x "$strScriptName" | tr " " "\n"

pid=$(pidof -x "$strScriptName" | tr " " "\n")
echo $pid

pidof -x "$strScriptName" | tr " " "\n"

私は次のようなものを得ます:

12703
12707 12703
12703

pidofコマンドのみを使用すると単一のPIDが生成されますが、結果を変数に保存すると2つのPIDが生成される理由を説明してください。 (trコマンドをオフにするとPIDが生成されるため、他のコマンドにパイプすることに関連しているようですが、結果を変数に保存すると、なぜ他の結果が出るのかというバグがあります。)

ベストアンサー1

これは、コマンド置換がBashでシェルプロセスの実際のコピーであるサブシェルを開始するためである可能性が高いです。したがって、2つのシェルがあり、両方がコマンドラインを介して実行されているプロセスとして表示されるため、見つかった場合はbash scriptname.sh2pidofつのシェルがあることがわかります。

(パイプは実際にはパイプの特定の部分のサブシェルも実行しますが、シェルは実際のコマンドを実行するのが早すぎるため、これを見ることができない場合があります。)

ただし、必要なものがスクリプトのPIDであれば、このクラスを使用する必要はなく、pidofPIDをとして使用できます$$。同様に、呼び出しスクリプトの名前を取得できます$0

おすすめ記事