Como evito que um script termine quando o shell sai?

5

Em particular, eu criei um script para iniciar o Firefox, o qual eu clico duas vezes e escolho 'Run in terminal', mas quando o shell sai, o Firefox é morto imediatamente.

Como evito que isso aconteça?

    
por Garrett Hall 29.11.2011 / 21:36

3 respostas

6

Você precisa colocar o nohup antes do comando que inicia o firefox , por isso ele precisa ser assim:

>$ nohup firefox

    
por 29.11.2011 / 22:06
1

Além disso, certifique-se de executar o firefox como um job em background e não como um front running, já que o shell é pai e está aguardando que o firefox seja executado e saia antes que o prompt seja retornado.

    
por 30.11.2011 / 08:10
0

A maioria das soluções que você encontra na rede, executará o script do firefox em um subshell. Você obterá o controle de volta, depois que essa subshell sair. Se o script firefox for executado em segundo plano, você não verá as alterações e variáveis definidas e, se o shell pai (o shell real) sair, provavelmente continuará em segundo plano.

A principal razão por trás disso, que os shells, incluindo o bash, têm uma diferença muito clara entre os seus

  • modos interativos : onde exibem prompt, lêem comandos do usuário e os executam em um ciclo.
  • e modos não interativos : neste caso, eles estão sendo executados essencialmente como uma linguagem de intérprete, interpretando um script de shell.

Não existe uma maneira fácil de alterar o bash de um modo de script não interativo para um interativo, após uma execução de script (desta vez, o script firefox starter / wrapper).

Seria possível, mas como eu sei, nenhum shell tem suporte para isso.

Felizmente, existem muitas maneiras difíceis de alcançar seu objetivo:

  1. Você pode executar o script não interativo como o arquivo de inicialização do seu bash. Então: bash --bashrc /here/is/what/i/want.sh .
  2. Você pode modificar /here/is/what/i/want.sh para reexecutar seu próprio intérprete, mas desta vez já no modo interativo. Isso pode ser feito com um comando exec /bin/bash -i . Basta colocar isso no final do seu script.
por 11.09.2015 / 23:15