Sí. La bifurcación se deletrea &
:
echo child & echo parent
Lo que puede confundirte es que $$
no es el PID del proceso de shell, es el PID del proceso de shell original . El punto de hacerlo de esta manera es que $$
es un identificador único para una instancia particular del script de shell: no cambia durante la ejecución del script, y es diferente de $$
cualquier otro script que se ejecute simultáneamente. Una forma de obtener el PID real del proceso de shell es sh -c 'echo $PPID'
.
El flujo de control en el shell no es el mismo que C. Si en C escribirías
first(); fork(); second(); third();
entonces un equivalente de shell es
after_fork () { second; third; }
first; after_fork & after_fork
La forma de shell simple first; child & parent
corresponde al idioma habitual de C
first(); if (fork()) parent(); else child();
&
y $$
existe y se comporta de esta manera en cada shell de estilo Bourne y en (t) csh. $PPID
no existía en el shell Bourne original pero está en POSIX (por lo que está en ash, bash, ksh, zsh, ...).
Gilles 'SO- deja de ser malvado'
fuente
&
es tenedor, no hay ejecutivo involucrado. Fork + exec es cuando ejecutas un comando externo.exec
, pero los dos idiomas tienen un flujo de control diferente.&
inicia una subshell en la que se ejecuta el comando dado. Tenedor + ejecutivo. No puede simplemente poner&
sin comando anterior para ejecutar.&
una línea por sí mismo. Pero no puedes. No significa "tenedor aquí". Significa "ejecutar el comando anterior en segundo plano en una subshell".Sí, se llama subshells . El código de shell dentro del paréntesis se ejecuta como un subshell (fork). Sin embargo, el primer caparazón normalmente espera a que se complete el niño. Puede hacerlo asíncrono usando el
&
terminador. Véalo en acción con algo como esto:$ bash subsh.sh
fuente
&
es tenedor solo. Si desea ejecutar más de una tubería en el proceso secundario, es suficiente usar llaves (que realizan la agrupación sin crear un proceso secundario):{ sleep 2; echo child; } &
No hay una forma nativa de bash (o, que yo sepa, ninguna otra típica * nix shell) de hacer esto. Hay muchas maneras de generar procesos bifurcados que hacen algo más de forma asincrónica, pero no creo que haya nada que siga la semántica exacta de la llamada al sistema fork ().
El enfoque típico sería hacer que su script de nivel superior genere ayudantes que hacen el trabajo que desea dividir. Si lo haces
$0 $@ &
o lo que sea, comenzarás de nuevo desde el principio y tendrás que resolverlo de alguna manera.De hecho, estoy empezando a pensar en varias formas inteligentes en las que uno podría hacer exactamente eso ...
Pero , antes de que mi cerebro se deje llevar por eso, creo que una regla bastante buena es: si estás tratando de escribir algo en shell y se está llenando de trucos ingeniosos y deseas más funciones de lenguaje, tiempo para cambiar a un lenguaje de programación real .
fuente