GNU/Linux >> Tutoriales Linux >  >> Linux

¿Por qué el script de Bash no se cierra después de la ejecución?

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.


Linux
  1. ¿Por qué The Bash Script no reconoce los alias?

  2. ¿Por qué no funciona ~/.bash_profile?

  3. Bash Script para eliminar el archivo más antiguo de una carpeta?

  4. ¿Cómo detener el script Loop Bash en la terminal?

  5. ¿Por qué no puedo usar Cd en un script Bash?

¿Opción desconocida de Rsync de la ejecución del script Bash?

Bash + ¿Cómo salir del script secundario y del script principal en ambas ocasiones?

Canalizar hacia/desde el portapapeles en el script Bash

Cómo obtener el estado de salida de un bucle en bash

Generar error en un script Bash

Ejecute el script bash después de iniciar sesión