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ê iniciavim
e o suspende com Ctrl-Z .
A saída dejobs
será:[1] Running dolphin . & [2]- Running kate & [3]+ Stopped vim
vim
é 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
vim
ainda está sinalizado com+
exterm
com-
.
O último trabalho em segundo plano marcado com-
éxterm
e não maiskate &
. -
Em outras palavras, o sistema age como se
- Primeiro, executa
xterm
: o novo comando (xterm
) se torna o atual evim
o anterior. - Em seguida,
xterm
é enviado em segundo plano e o controle volta para o anterior na lista (vim
com 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