Estoy depurando una rareza con un script de shell y me pregunto si he entendido mal cómo funciona la "bifurcación" ( & ) de Bash, tal vez porque generalmente lo uso en comandos individuales a través de una terminal, por ejemplo:
[~me]$ someExecutable &Ahora, en un script de shell:
foo() { echo "logic" } bar() { echo "idic" } baz() { echo "katra" } foo & bar baz Mi intención es que la función foo se invoque de forma asincrónica y luego que el resto del script continúe ejecutándose en el contexto del proceso original.
Cuando ejecuto este script de ejemplo , obtengo el resultado esperado:
logic idic katra (es decir, solo llamadas aparentes únicas a bar y baz ; no me molesta en absoluto el orden relativo de las tres líneas de salida, que entiendo puede variar)
pero puedo estar malinterpretando tanto el resultado como el script en sí. Si es así, eso sin duda explicaría la rareza que veo en mi código real y me evitaría tener que seguir investigando.
¿Es posible que, en el proceso hijo, después de la llamada a foo , el script de shell bifurcado continúe? ¿Significa que el resto de mi script de shell se ejecutará dos veces ?
¿Qué sucede realmente cuando uso & me gusta esto en un script Bash?
El ampersand solo bifurca la llamada a foo() en su ejemplo. No está bifurcando todo el guión. Solo foo() se ejecuta en un hilo separado, que sale cuando termina foo(). bar() y baz() continúan ejecutándose en el mismo hilo
El & en bash no es una bifurcación. Le dice a bash que inicie el comando en una subcapa y continúe analizando otros comandos (en lugar de esperar a que termine ese comando).
Por lo tanto, como esperaba, ejecuta 'foo' en segundo plano y continúa procesando el comando 'bar' y 'baz' en el shell de nivel superior. No se produjo ninguna bifurcación del shell de llamada, pero se ejecutó 'foo' en segundo plano.
Entonces, la salida de "foo" podría ocurrir después de bar o baz, dependiendo de su contenido ... pero como usa "echo", que es un shell incorporado, en el momento en que se configura el proceso de fondo "foo", el "echo " está inmediatamente disponible para él: por lo tanto, es muy probable que vea su salida antes de que el shell que llama pase al siguiente comando, que aparentemente es lo que sucede en su caso. (¡Pero YMMV! Si "foo" estaba llamando a un comando externo pesado, es probable que su salida ocurra más adelante)
En la terminal, es casi lo mismo: podría considerar una ventana de terminal con un indicador de shell como un script de archivo para ese shell, que el shell de inicio de sesión lee "mientras lo escribe". El comportamiento es casi el mismo.
El carácter & le dice al shell que ejecute un comando (o un grupo de comandos) en segundo plano.
Los siguientes comandos se ejecutan inmediatamente.
No hay peligro de ejecutar el script dos veces, por lo que es diferente al fork() de C en ese aspecto.