2011-10-22 16 views
19

Soy un principiante de scripts bash, y tengo una "tarea" que hacer. Me di cuenta de la mayoría de las cosas, pero hay una parte que dice que tengo que repetir el pid del padre bash y el pid de las dos subshells que voy a ejecutar. Así que busqué en línea y encontré este (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. 

Así que aquí están mis preguntas:

1) ¿Qué significa la primera impresión eco? ¿Es este el pid del bash padre?

2) ¿Por qué el segundo eco imprime 0?

3) ¿Es $ BASH_SUBSHELL un comando o una variable?

4) Estoy haciendo todo en un Mac, voy a intentar todo esto en una máquina Linux en algunos días, pero cada vez que ejecutar este script $BASHPID no devuelve nada, acabo de recibir una nueva línea. ¿Esto es porque estoy ejecutando esto en un Mac y $BASHPID no funciona en un Mac?

Respuesta

22

En cuanto a documentation en esto, que parece:

  1. $$ significa que el ID del proceso que el archivo de secuencia de comandos se ejecuta bajo. Para cualquier secuencia de comandos determinada, cuando se ejecuta, tendrá solo una ID de proceso "principal". Independientemente de cuántas subcapas invoque, $$ siempre devolverá el primer ID de proceso asociado con el script. BASHPID le mostrará el ID del proceso de la instancia actual de bash, por lo que en una subcategoría será diferente al bash de "nivel superior" que puede haberlo invocado.
  2. BASH_SUBSHELL indica el "nivel de subshell" en el que se encuentra. Si no se encuentra en ningún nivel de subshell, su nivel es cero. Si inicia una subshell dentro de su programa principal, ese nivel de subshell es 1. Si inicia una subshell dentro de esa subshell, el nivel sería 2, y así sucesivamente.
  3. BASH_SUBSHELL es una variable.
  4. ¿Tal vez BASHPID no es compatible con la versión de bash que tiene? Dudo que sea un problema de "Mac".
+0

gracias por responder y despejar estas cosas por mí . Descubrí que tengo GNU bash, versión 3.2.48 (1). – captain

6

Sería mejor para conseguir bien informado de 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 se introdujo con bash-4.0-alpha. Si ejecuta bash --version, puede averiguar qué versión de bash(1) está usando.

Si usted va a estar haciendo mucho bash(1) trabajo, también necesitará lo siguiente:

+0

So $ BASHPID no funciona para mí ya que tengo la versión 3.2.48. probablemente necesito actualizar mi versión bash. – captain

+0

No actualice el OS X proporcionado 'bash'.Si desea una nueva versión de 'bash (1)' por algún motivo, asegúrese de instalarlo de tal forma que no afecte de ningún modo al shell provisto por el sistema. No tengo idea de cuánta compatibilidad con versiones anteriores bash4 ha mantenido con bash3, pero a menos que Apple se haya esforzado por mantenerse dentro de los límites de POSIX 'sh' (u otro subconjunto restringido de funcionalidades), la actualización de versiones podría romper algo. – sarnold

+6

Si no tiene $ BASHPID en su versión de bash, puede usar export BASHPID = $ (sh -c 'echo $ PPID') para obtenerlo – ACyclic