2011-10-22 42 views
19

我是bash腳本初學者,我有一個「作業」要做。我想到了大部分東西,但有一部分內容說我必須回顯父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)爲什麼第二個回波打印出0?

3)$ BASH_SUBSHELL是命令還是變量?

4)我在mac上做所有事情,我會在幾天內在Linux機器上嘗試所有這些,但是每當我運行這個腳本時 不會返回任何東西,我只需要換一行。這是因爲我在Mac上運行此和$BASHPID無法在Mac上工作?

回答

22

看着documentation此,它看起來像:

  1. $$意味着腳本文件下運行的進程ID。對於任何給定的腳本,當它運行時,它將只有一個「主」進程ID。無論您調用多少個子殼,$$將始終返回與該腳本關聯的第一個進程ID。 BASHPID將向您顯示當前bash實例的進程ID,因此在子shell中它將與可能調用它的「頂級」bash不同。
  2. BASH_SUBSHELL表示您所處的「子外殼級別」。如果您不在任何子外殼級別,則級別爲零。如果您在主程序中啓動了一個子shell,那麼該子shell級別爲1.如果您在該子shell中啓動一個子shell,那麼該級別將爲2,依此類推。
  3. BASH_SUBSHELL是一個變量。可能BASHPID不支持bash的版本嗎?我懷疑這是一個「Mac」問題。
+0

謝謝回答和清除這些東西對我來說。我發現我有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)的版本。

如果你打算做多少工作bash(1),您還需要執行以下操作:

+0

所以$ BASHPID不適合我,因爲我有版本3.2.48。可能我需要更新我的bash版本。 – captain

+0

不要升級提供'bash'的OS X.如果因爲某種原因需要新版本的'bash(1)',請確保以任何方式不影響系統提供的shell的方式進行安裝。我不知道bash4與bash3保持了多大的向後兼容性,但除非Apple努力保持POSIX'sh'(或其他一些受限制的功能子集)的限制,否則升級版本可能會破壞某些內容。 – sarnold

+6

如果您的bash版本中沒有$ BASHPID,則可以使用導出BASHPID = $(sh -c'echo $ PPID')來獲取它 – ACyclic