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 .