2011-10-22 19 views
19

Sono un principiante di scripting bash e ho un "compito" da fare. Ho immaginato la maggior parte delle cose, ma c'è una parte che dice che devo echeggiare il pid del genitore bash e il pid delle due sotto shell che eseguirò. Così ho guardato online e ho trovato questo (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. 

Così qui sono le mie domande:

1) Che cosa significa la prima stampa eco? È questo il pid del padre bash?

2) Perché il 2 ° eco stampa 0?

3) $ BASH_SUBSHELL è un comando o una variabile?

4) Sto facendo tutto su un Mac, cercherò tutto questo su una macchina Linux in alcuni giorni, ma ogni volta che eseguire questo script $BASHPID non restituisce nulla, ho appena ottenere una nuova linea. È perché sto facendo funzionare questo su un mac e $BASHPID non funziona su un mac?

risposta

22

Guardando documentation su questo, sembra che:

  1. $$ significa l'ID del processo che il file di script è in esecuzione. Per ogni dato script, quando viene eseguito, avrà un solo ID di processo "principale". Indipendentemente dal numero di sottochiavi richiamati, $$ restituirà sempre il primo ID di processo associato allo script. BASHPID mostrerà l'ID di processo dell'istanza corrente di bash, quindi in una sottoshell sarà diverso dal bash "di primo livello" che potrebbe averlo invocato.
  2. BASH_SUBSHELL indica il "livello subshell" in cui ci si trova. Se non si è in alcun livello di subshell, il proprio livello è zero. Se si avvia una subshell all'interno del proprio programma principale, tale livello di subshell è 1. Se si avvia una subshell all'interno di quella subshell, il livello sarà 2 e così via.
  3. BASH_SUBSHELL è una variabile.
  4. Forse BASHPID non è supportato dalla versione di bash che hai? Dubito che sia un problema "Mac".
+0

grazie per la risposta e la cancellazione di queste cose per me . Ho scoperto che ho GNU bash, versione 3.2.48 (1). – captain

6

Sarebbe meglio per ottenere ben informato di 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. 

$BASHPID è stato introdotto con bash-4.0-alpha. Se esegui bash --version, puoi scoprire quale versione di bash(1) stai utilizzando.

Se avete intenzione di fare molto bash(1) lavoro, avrete anche bisogno di quanto segue:

+0

Quindi $ BASHPID non funziona per me dato che ho la versione 3.2.48. probabilmente ho bisogno di aggiornare la mia versione di bash. – captain

+0

Non aggiornare l'OS X fornito 'bash'.Se vuoi una nuova versione di 'bash (1)' per qualche ragione, assicurati di installarla in modo tale da non influenzare in alcun modo la shell fornita dal sistema. Non ho idea di quanta retrocompatibilità bash4 sia stata mantenuta con bash3, ma a meno che Apple non abbia fatto uno sforzo per rimanere entro i limiti di POSIX 'sh' (o qualche altro sottoinsieme limitato di funzionalità), le versioni di aggiornamento potrebbero rompere qualcosa. – sarnold

+6

Se non si dispone di $ BASHPID nella versione bash, è possibile utilizzare l'esportazione BASHPID = $ (sh -c 'echo $ PPID') per ottenerlo – ACyclic