1450256とBashの違いを学ぶ


最近、シェルスクリプトに取り組んでいて、bashの特殊変数 $ BASHPID の動作に大きな違いが見られました。 Linuxで実行されているすべてのプロセスには、プロセスIDが割り当てられます。これが、オペレーティングシステムがプロセスを処理する方法です。

同様に、bashターミナルセッションにもプロセスIDが割り当てられます。現在のシェルのプロセスIDを格納する $ および と呼ばれる特別な変数があります。

先に進み、以下のコマンドを実行して、現在のシェルのプロセスIDを確認します。 $ の両方が同じ値を返します。

$ echo $$               # Printing special variable $
$ echo $BASHPID         # Printing the varibale $BASHPID

bashでは、シェルから外部プログラムを呼び出すと、子プロセス/サブシェルが作成され、プログラムは子プロセスでのみ送信されます。親シェルがプログラムを実行するためのサブシェルを作成する方法を示すために、「sample.sh」というスクリプトに単純なプロセスモニターコマンドを配置した以下の例を参照してください。

#!/usr/bin/env bash

ps -ef --forest | grep -i bash

このスクリプトを実行すると、bashのプロセスIDを取得できます。下の画像から、スクリプトを呼び出したときにbashが子プロセスを作成し、スクリプトを実行したことがわかります。

$ ./sample.sh

次に、スクリプト内で $ の両方を使用して、何が返されるかを見てみましょう。

#!/usr/bin/env bash
echo "============================"
ps -ef --forest | grep -i bash
echo "============================"
echo "PID USING $ FOR SCRIPT $0 ==> $$"
echo "PID USING BASHPID FOR SCRIPT $0 ==> $BASHPID"
echo

ここで、スクリプトを再度実行します。

$ ./sample.sh

了解しました。同じプロセスIDを返します。これが実際の違いです。 parentheses()内でコマンドを実行して、スクリプト内に別の子プロセスを作成しましょう。

# STORING THE PID INTO A VARIABLE…

VAR_HASH=$(echo $$)
VAR_BASHPID=$(echo $BASHPID)

echo "VALUE OF VAR_HASH ==> $VAR_HASH"
echo "VALUE OF VAR_BASHPID ==> $VAR_BASHPID"

bashでは、括弧は子プロセスを呼び出し、括弧内にあるものはすべて実行します。その場合、 $ の両方に新しい子プロセスIDを格納する必要があります。ただし、上の画像から、 $ が親ID(スクリプトsample.shのプロセスID)である382を格納し、 が括弧で作成された子プロセスIDを作成しました。

それでは、この動作を理解してみましょう。 manページの内容を確認します。

$ man bash

$ を使用すると、サブシェル内であっても、作成元の親プロセスのプロセスIDが格納されます。ただし、 BASHPID は現在のプロセスIDを格納します。つまり、括弧内に呼び出されると、子プロセスIDが格納されます。

変数 $ を割り当てたり変更したりすることはできませんが、 BASHPID を再割り当てすることはできますが、効果はありません。

$ $=10
$ BASHPID=10
$ echo $BASHPID

BASHPIDの設定を解除することができます。設定を解除すると、特別な状態が失われ、これを正規変数として使用できるようになります。

$ unset BASHPID
$ echo $BASHPID
$ BASHPID="Tecmint"
$ echo $BASHPID

シェルのプロセスIDを割り当てようとしても、シェルはすでに特別な状態を失っているため、ユーザー定義変数として扱われます。

$ BASHPID=$(echo $$)
$ echo $$;echo $BASHPID

この場合、BASHPIDの新しいターミナルセッションを使用して、その特別な状態を取得する必要があります。

この記事は以上です。この記事では、 $ BASHPID の違いとその動作を確認しました。この記事に目を通し、貴重なフィードバックを私たちと共有してください。