'$' 事前定義されたシェル変数 (「$$」と呼ばれる)。それは何を持っていますか? [コピー]

'$' 事前定義されたシェル変数 (「$$」と呼ばれる)。それは何を持っていますか? [コピー]

私はタイプミスを作成し、bashスクリプトに$$(エコーの引数として)を書きました。数字(1979)が印刷されます。私はこれを何度も試しましたが、同じ数字を印刷したので、これはUnixの時代と関係があると思いました。 bashのマニュアルやインターネットでこれに関する情報が見つかりませんでした。その後、デフォルトのshを試してみましたが、別の番号5755が印刷され、新しいshを閉じて開いたときに少し異なる番号が印刷されました。

この変数には何が必要ですか?この数字はどういう意味ですか?

答え1

多くの特殊なシェル変数の一つです。 ~からPOSIX規格これに関連する:

$

呼び出しシェルの10進プロセスIDに展開されます。サブシェル(参照)シェル実行環境)、$現在のシェルと同じ値に拡張する必要があります。

他の特殊なシェル変数には、!(最も最近開始されたバックグラウンドジョブのPID)、?(最も最近終了したジョブの終了状態)、#(位置引数の数) 、(位置引数、*単一文字列で連結)、@(位置引数、として含まれています リスト) , -(現在のシェルオプション) と0(0, シェルまたはスクリプトの名前).

また、bashマニュアルの「特殊パラメータ」セクションで:

$

シェルのプロセスIDに展開されます。サブシェルでは、()サブシェルではなく現在のシェルのプロセスIDに展開されます。

他のシェルのマニュアルにも同様のフレーズがあります。

つまり、$入力を通じて値を取得した変数は、$$現在のシェルプロセスのプロセスID(PID)を保持します。

次のように再確認できます。

% echo "$$"
85776
% ps -p "$$"
  PID TT  STAT        TIME COMMAND
85776 p1  SN       0:00.19 -zsh (zsh)

これは、私の特定のシェルプロセスが85776に拡張され、このPIDが私が使用しているログインシェルと$$一致することを示しています。zsh

答え2

この変数は、現在のシェルのPID、つまりプロセスIDを表示します。与えられたシェルでこの変数をエコー(またはアクセス)するたびに同じです。新しいシェル(またはサブシェル)を起動してアクセスするたびに、元のシェルとは異なります。

関連情報