En mi servidor remoto con bash 4.2.46, puedo hacer esto:
$ sleep 100 & pid=$!; echo "$pid"; wait "$pid"
[3] 7646
7646
Sin embargo, en mi Mac con bash 3.2.57, no funciona:
$ sleep 100 & pid=$!; echo "$pid"; wait "$pid"
-bash: !: event not found
¿Qué está pasando? De alguna manera, he estado usando macOS bash
durante años sin haber tenido este problema antes... pero juro que he ejecutado muchos programas de shell que utilizan este $!
método exacto para obtener la identificación del proceso de un proceso en segundo plano y nunca se rompió.
Respuesta1
El !
es el carácter desencadenante paraexpansión de la historia, habilitado en shells interactivos de forma predeterminada.
No creo que sirva de nada útil pid=$!;
en tu caso o en echo "$!"
. Como puede ver en el mensaje de error, intenta utilizar una cadena vacía para buscar, en lugar de algo como !foo
buscar foo
. Las versiones más nuevas de Bash son más sensatas en eso $!
o "!"
no lo activan, pero la 3.2 es un poco estúpida con eso.
Lo que parece funcionar es pid=$! ;
con el espacio antes del punto y coma. O simplemente podrías desactivar la expansión del historial con set +H
. (Tenga en cuenta que"$!"
notrabajar en 3.2.)