Como corrigir (versão curta)
Você tem algumas maneiras de fazer isso:
-
Com
%-, você pedirá para negar o último trabalho em segundo plano .xterm &> /dev/null & disown %- -
Com
$!, você pedirá para negar o último trabalho executado (através de seu PID).xterm &> /dev/null & disown $!
Então será necessário escrever mais alguns caracteres, mas pelo menos você pode escolher quais :-)
As razões
O motivo está todo aqui: quando você executa um trabalho enviando-o para o plano de fundo com & , essencialmente ele não altera o trabalho atual, mas apenas o anterior. O trabalho atual permanece o que foi antes.
Algumas palavras mais e um exemplo
Você pode verificar o que foi dito acima com o comando jobs , comparando sua saída antes e depois para lançar um trabalho em segundo plano.
-
Antes : suponhamos que você tenha alguns processos em segundo plano sendo executados em um terminal (por exemplo, lançado com
dolphin &ekate &).
Agora você iniciavime o suspende com Ctrl-Z .
A saída dejobsserá:[1] Running dolphin . & [2]- Running kate & [3]+ Stopped vimvimé o trabalho atual, marcado com um+ekateé o anterior, sinalizado com-.De fato, no manual de referência bash, capítulo 7.1 [ 1 ] é explicado que
"Na saída pertencente a tarefas (por exemplo, a saída do comando jobs), a tarefa atual é sempre marcada com um '+' e a tarefa anterior com um '-'. " -
Após : Finalmente, você escreve seu comando
xterm &> /dev/null &(semdisown).Perguntando ao
jobs, desta vez ele responderá:[1] Running dolphin . [2] Running kate [3]+ Stopped vim [4]- Running xterm &> /dev/null &Observe que
vimainda está sinalizado com+extermcom-.
O último trabalho em segundo plano marcado com-éxterme não maiskate &. -
Em outras palavras, o sistema age como se
- Primeiro, executa
xterm: o novo comando (xterm) se torna o atual evimo anterior. - Em seguida,
xtermé enviado em segundo plano e o controle volta para o anterior na lista (vimcom seu status), que se torna novamente o atual e é marcado novamente com+xtermé o novo trabalho anterior e está marcado com um-. - No final, você encontra atualizado apenas o trabalho anterior (-) e não o atual (+).
- Primeiro, executa
Como você pode chamar disown seguido por um número de trabalho ou por um PID, você tem as duas variantes
-
%-: o trabalho anterior pode ser referenciado usando%-, talvez mais fácil de lembrar se você acha que também em trabalhos está marcado com- -
$!: o PID do último trabalho executado em segundo plano está no parâmetro especial$![2 ] .
O comando disown aceitará ambos.
Referências