/ / Cómo realizar tareas en segundo plano dentro de un bucle de bash - bash, bucles, fondo

Cómo realizar tareas en segundo plano dentro de un bucle de bash - bash, bucles, fondo

Dado el siguiente bucle de bash:

for ((x=1; x<=$y; x++)); do echo $x; done
1
2
3
4

¿Cómo "hacer fondo" las tareas individuales?

09:25:58/~ $for ((x=1; x<=$y; x++)); do echo $xi &; done
-sh: syntax error near unexpected token `;"

Intenté "golpear" el eco y eso tampoco funcionó:

09:26:37/~ $for ((x=1; x<=$y; x++)); do bash -c "echo $x" &; done
-sh: syntax error near unexpected token `;"

Respuestas

2 para la respuesta № 1

Ambos & y ; Son terminadores de comando en el shell.

Solo necesitas terminar cada comando una vez. Así que no uses los dos juntos.

for ((x=1; x<=$y; x++)); do echo $x & done

Obtendrías el mismo error usando dos ;s también:

$ for ((x=1; x<=$y; x++)); do echo $x ; ; done
-bash: syntax error near unexpected token `;"

Tenga en cuenta que tratando de usar ;; recibe un error diferente porque ;; es un token especial para el shell (usado en case declaraciones):

-bash: syntax error near unexpected token `;;"

Gramatica de shell:

%start  complete_command
%%
complete_command : list separator
| list
;
list             : list separator_op and_or
|                   and_or
;
....
separator_op     : "&"
| ";"
;
separator        : separator_op linebreak
| newline_list
;

1 para la respuesta № 2
for ((x=1; x<=$y; x++)); do { echo $x & } ; done

1 para la respuesta № 3

Esto funcionará:

for ((x=1; x<=y; x++)); do echo $x & done

Tenga en cuenta que no hay ; después &. Sin embargo, usar saltos de línea lo hará más legible:

for ((x=1; x<=y; x++)); do
echo $x &
done