Já experimentou o comando fg
?
fg %2
Estes dois processos:
cat /dev/tty > /dev/null &
cat /dev/zero > /dev/null &
tem que ser executado em segundo plano, mas estou tendo problemas para trazer o segundo trabalho para o primeiro plano.
Já experimentou o comando fg
?
fg %2
Enquanto $!
contém o ID do processo do mais alto processo do último trabalho iniciado em segundo plano, é surpreendentemente difícil obter seu ID trabalho em um maneira infalível.
Não é necessariamente o maior ID de trabalho, pois os IDs de trabalho são reutilizados. Não é necessariamente o trabalho a que você pode referir-se por %%
ou %+
(ou que fg
sem argumento agiria), pois os trabalhos suspensos têm precedência (como no seu caso em que o primeiro trabalho provavelmente será suspenso, pois tentará ler a partir do tty enquanto não estiver em primeiro plano) ou o trabalho iniciado mais recentemente pode ter morrido já (nesse caso, %+
se referiria ao próximo trabalho na lista).
Então, você precisa executar jobs
primeiro para saber qual é o número do trabalho para o trabalho que você deseja fg
(use% usefg %thatnumber
) ou se não há outro trabalho com zero
em seu trabalho. nome, execute:
fg %\?zero
Com zsh
, você pode usar:
fg_most_recent() {
local job=${(k)jobstates[(R)*:$!=*]}
((job)) && fg %$job
}
Ou seja, obtenha a k
ey da matriz associativa $jobstates
cujo valor corresponde ao padrão *:$!=*
( $jobstates
se parece com running:+:20162=running:20163=running
fornecendo o status de todos os processos na tarefa que zsh
começou diretamente).
Se isso fosse dois trabalhos comuns, então um fg
simples colocaria o segundo trabalho em primeiro plano se esse fosse o trabalho em segundo plano suspenso mais recentemente ou os trabalhos em segundo plano iniciados mais recentemente (sem nenhum outro trabalho suspenso).
No entanto, pela natureza do primeiro trabalho (leitura de /dev/tty
), ele será interrompido assim que tentar ler o TTY. fg
colocará novamente em primeiro plano.
A solução aqui é usar %-
ou %2
, já que não há outros trabalhos.
Quando um trabalho é colocado em segundo plano, seja iniciando o trabalho com um &
à direita ou suspendendo um trabalho em primeiro plano com Ctrl + Z e, em seguida, fornecendo o comando bg
, o trabalho recebe um "ID de trabalho" ou "especificação de trabalho". Esse ID de trabalho é geralmente denotado por %N
, em que N
é um número decimal.
Você pode usar o ID do trabalho com vários comandos, como wait
, kill
, fg
e bg
. O comando kill
, por exemplo, pode ser usado para enviar um sinal para um trabalho em segundo plano usando seu ID de trabalho.
O comando fg
, por padrão, funciona no "trabalho atual". O ID do trabalho atual está disponível como %+
ou %%
. O trabalho atual é o trabalho em segundo plano iniciado mais recentemente ou, se houver trabalhos suspensos, o último trabalho suspenso.
Para mover um trabalho de segundo plano arbitrário para o primeiro plano, use seu ID de trabalho:
$ sleep 1000 &
[1] 37327
$ sleep 500 &
[2] 83532
$ jobs
[1]- Running sleep 1000 &
[2]+ Running sleep 500 &
$ fg %1
sleep 1000
O +
na saída de jobs
denota o "trabalho atual" (que é o que seria alternado com uma simples invocação de fg
).
IDs de trabalho especial padrão POSIX:
%%
, o trabalho atual. %+
, o mesmo que acima. %-
, o trabalho anterior. %N
, número do trabalho N
. %string
, a tarefa cujo comando começa com string
. %?string
, o job cujo comando contém string
.