Compilé una breve frase de bash para enfocar una aplicación en ejecución o iniciarla si no se está ejecutando:
#!/bin/bash
#intellilaunch.sh
wmctrl -a $1 || $1 & disown
exit 1
El comando sale perfectamente bien cuando se ejecuta directamente desde la línea de comando:
:~$ wmctrl -a firefox || firefox & disown
[1] 32505
Una comprobación rápida con el monitor del sistema muestra que solo se está ejecutando Firefox.
Sin embargo, cuando ejecuto Firefox a través del script (./intellilaunch.sh firefox
) genera un nuevo proceso persistente llamado intellilaunch.sh firefox
, que solo sale después de cerrar Firefox.
¿Qué estoy haciendo mal?
Editar :
Modifiqué mi script según la sugerencia de michas:
#!/bin/bash
program=$(basename $1)
if ! wmctrl -a "$program"; then
"$1"&
fi
¡Ya no es una sola línea, pero ahora funciona perfectamente bien!
Respuesta aceptada:
No puedo reproducir este comportamiento en mi sistema. Según su descripción, parece que hay un proceso que no está configurado correctamente en segundo plano.
Intente ejecutar como bash -x intellilaunch.sh xclock
, esto debería mostrar lo que está pasando.
También ||
se une más fuerte que &
, por lo tanto, envía toda la tubería en segundo plano. Tal vez un if
explícito sería una buena idea.
tu
wmctrl -a firefox || firefox & disown ; exit 1
se interpreta como
( wmctrl -a firefox || firefox ) & disown ; exit 1
mientras que probablemente quisiste decir
wmctrl -a firefox || ( firefox & disown ) ; exit 1
Debido a eso, bash iniciará dos tareas, una con wmctl y firefox, y otra con disown y exit. Como el trabajo en segundo plano necesita poco tiempo para iniciarse, probablemente iniciará los comandos un poco más tarde, por eso la salida de bash -x
parece estar en el orden incorrecto.