2011-10-22 9 views
19

私はbashスクリプトの初心者です。私は "宿題"を持っています。私はほとんどのものを考え出しましたが、私が実行する2つのサブシェルの親bashとpidのpidをエコーし​​なければならないという部分があります。だから私は、オンラインで見て、この(The Linux documentation project)が見つかりました:だからここ

#!/bin/bash4 

echo "\$\$ outside of subshell = $$"        # 9602 
echo "\$BASH_SUBSHELL outside of subshell = $BASH_SUBSHELL"  # 0 
echo "\$BASHPID outside of subshell = $BASHPID"     # 9602 

echo 

(echo "\$\$ inside of subshell = $$"        # 9602 
    echo "\$BASH_SUBSHELL inside of subshell = $BASH_SUBSHELL"  # 1 
    echo "\$BASHPID inside of subshell = $BASHPID")    # 9603 
    # Note that $$ returns PID of parent process. 

を私の質問は以下のとおりです。

1)最初のエコーの印刷を行いますか?これは親のbashのpidですか?

2)2番目のエコーが0になるのはなぜですか?

3)$ BASH_SUBSHELLはコマンドか変数ですか?

4)私はすべてのことをMacでやっていますが、Linuxマシンで何度か試してみますが、 このスクリプトを実行するたびに何も返されません。新しい行が表示されます。これは私がMacでこれを実行しているので$BASHPIDはMacで動作しないのですか?

答えて

22

この上documentationを見ると、それは次のようになります。

  1. $$は、スクリプトファイルがで実行されているプロセスIDを意味します。任意のスクリプトに対して、実行時には、「メイン」プロセスIDが1つしかありません。呼び出すサブシェルの数にかかわらず、$$は常にスクリプトに関連付けられた最初のプロセスIDを返します。 BASHPIDは、bashの現在のインスタンスのプロセスIDを表示するので、サブシェルでは起動している可能性のある「トップレベル」のbashとは異なります。
  2. BASH_SUBSHELLは、あなたがいるサブシェルレベルを示します。サブシェルレベルにない場合、レベルはゼロです。メインプログラム内でサブシェルを起動すると、そのサブシェルレベルは1になります。サブシェル内でサブシェルを開始すると、レベルは2になります。
  3. BASH_SUBSHELLは変数です。
  4. おそらくBASHPIDは、使用しているbashのバージョンではサポートされていませんか?私はそれが "Mac"の問題だとは思わない。
+0

ありがとう:

あなたは多くのbash(1)仕事をやっているつもりなら、あなたはまた、次の必要があります。 GNU bashバージョン3.2.48(1)があることが判明しました。 – captain

6

それはbash(1)熟知取得するための最良のだろう:

BASHPID 
      Expands to the process ID of the current bash process. 
      This differs from $$ under certain circumstances, such 
      as subshells that do not require bash to be re- 
      initialized. 
    [...] 
    BASH_SUBSHELL 
      Incremented by one each time a subshell or subshell 
      environment is spawned. The initial value is 0. 

$BASHPIDbash-4.0-alphaで導入されました。 bash --versionを実行すると、使用しているbash(1)のバージョンを知ることができます。私のためにこれらの事を答えると、クリアするため

+0

バージョン3.2.48があるので、$ BASHPIDは私のためには機能しません。おそらく私は自分のbashバージョンを更新する必要があります。 – captain

+0

提供されたOS Xを 'bash'でアップグレードしないでください。何らかの理由で 'bash(1)'の新しいバージョンが必要な場合は、システム提供のシェルに影響を与えないようにインストールしてください。私は下位互換性のあるbash4がbash3とどのくらい保たれているのか分かりませんが、AppleがPOSIX sh(または他の機能の制限付きサブセット)の制限内にとどまるまで努力しない限り、バージョンをアップグレードすると何かが壊れる可能性があります。 – sarnold

+6

あなたのbashバージョンに$ BASHPIDがない場合は、BASHPID = $(sh -c 'echo $ PPID')をエクスポートして – ACyclic