Por que meu script não sai após a execução?

4

Eu compilei um one-liner bash curto para focar um aplicativo em execução ou iniciá-lo se não estiver em execução:

#!/bin/bash
#intellilaunch.sh

wmctrl -a $1 || $1 & disown
exit 1

O comando sai perfeitamente bem quando executado diretamente a partir da linha de comando:

:~$ wmctrl -a firefox || firefox & disown
[1] 32505

Uma verificação rápida com o monitor do sistema mostra que apenas o firefox está em execução.

No entanto, quando eu inicio o firefox através do script ( ./intellilaunch.sh firefox ) ele gera um novo processo persistente chamado intellilaunch.sh firefox , que só sai depois de fechar o firefox.

O que estou fazendo de errado?

Editar :

Eu modifiquei meu roteiro de acordo com a sugestão de michas:

#!/bin/bash

program=$(basename $1)

if ! wmctrl -a "$program"; then
  "$1"&
fi

Não é mais uma linha de uma linha, mas funciona perfeitamente bem agora!

    
por Glutanimate 25.12.2012 / 22:36

1 resposta

2

Não consigo reproduzir esse comportamento no meu sistema. A partir de sua descrição, parece que há um processo que não está definido corretamente para o plano de fundo.

Tente executar como bash -x intellilaunch.sh xclock , isso deve mostrar o que está acontecendo.

Também || liga mais strong que & , portanto, você envia o tubo inteiro em segundo plano. Talvez um if explícito seja uma boa ideia.

Seu

wmctrl -a firefox || firefox & disown ; exit 1

é interpretado como

( wmctrl -a firefox || firefox ) & disown ; exit 1

enquanto você provavelmente quis dizer

wmctrl -a firefox || ( firefox & disown ) ; exit 1 

Beause disso, o bash iniciará dois jobs um com o wmctl e o firefox - e outro com o disown e o exit. Como o trabalho em segundo plano precisa de um curto período de tempo para ser iniciado, ele provavelmente iniciará os comandos um pouco mais tarde, por isso a saída de bash -x parece estar na ordem errada.

    
por 26.12.2012 / 00:39

Tags