web-dev-qa-db-ja.com

echo $$が数値を返すのはなぜですか?

bashecho $$を実行すると7190のような数値が返されるのに、echo $を実行すると$のみが返されるのはなぜですか?

6
NerdOfLinux

コンベンション。

$$:シェルのプロセスIDに展開します。 ()サブシェルでは、サブシェルではなく、呼び出し元のシェルのプロセスIDに展開されます(以下のマニュアルへのリンクを参照)。

rinzwind@schijfwereld:~$ echo $$
3244
rinzwind@schijfwereld:~$ ps -ef |grep 3244
rinzwind  3244  3237  0 19:06 pts/0    00:00:00 /bin/bash

ソフトウェアをコーディングするときに非常に便利です。そして、一時ファイルを作成する粗雑な(mktempの方が良い方法です)方法として使用できます。

1 $には特別な意味はないので、echoが常に行うことを返します。

マニュアルページ があります(3.4.2特殊パラメーター)。

17
Rinzwind

Bashでは、変数を使用して$を使用し、最初のドル記号で$$を使用して、変数を使用し、2番目の変数を使用してその変数の名前を伝えます実際は$です。実際には命名規則であり、この変数には現在のシェルのプロセスIDが含まれています。

$$$$のコメントで尋ねたように、同じプロセスIDを2回返しています。


他の変数もあります(From here ):

  • $1$2$3、...は 位置パラメーター です。
  • "$@"は、すべての定位置パラメーター{$1, $2, $3 ...}の配列のような構造です。
  • "$*"は、すべての定位置パラメーター$1 $2 $3 ...のIFS拡張です。
  • $#は定位置パラメーターの数です。
  • $-現在のシェルのオプションセット。
  • $$現在のシェル(サブシェルではない)のpid。
  • $_最新のパラメーター(または、起動直後に現在のシェルを起動するコマンドのabsパス)。
  • $IFSは(入力)フィールド区切り文字です。
  • $?は、最新のフォアグラウンドパイプラインの終了ステータスです。
  • $!は、最新のバックグラウンドコマンドのPIDです。
  • $0は、シェルまたはシェルスクリプトの名前です。
11
Ravexina

以下は、 Lock Screen Timer から取得した$$の実際のアプリケーションです。

# Check if lock screen timer already running
pID=$(pgrep -f "${0##*/}") # All PIDs matching lock-screen-timer name
PREVIOUS=$(echo "$pID" | grep -v ^"$$") # Strip out this running copy ($$$)
if [ "$PREVIOUS" != "" ]; then
    kill "$PREVIOUS"
    rm ~/.lock-screen-timer-remaining
    zenity --info --title="Lock screen timer already running" --text="Previous lock screen timer has been terminated."
fi

このコードでは、次の行を抜粋しています。

PREVIOUS=$(echo "$pID" | grep -v ^"$$") # Strip out this running copy 

現在実行中のプロセス($$)を使用して、同じ名前(この場合は-v)で実行されているすべてのプロセスのリストから(lock-screen-timerではなく)削除します。

以前に実行中のコピーがあった場合、コードはそれを強制終了し、使用していたワークファイルを削除します。

1