Linux / Comando fg: trazer um trabalho ao primeiro plano no Bash

fg traz para o primeiro plano um trabalho em segundo plano ou parado que o Bash atual acompanha. Use-o para devolver o acesso ao terminal a um programa interativo ou para esperar por um trabalho até ele terminar ou parar novamente.

Confira o número com jobs no Bash atual. A referência %1 representa o trabalho número 1 nessa sessão, não o identificador de um processo, o PID. Ao assumir o primeiro plano, o trabalho mantém o shell aguardando; o prompt volta quando ele termina ou é suspenso novamente.

Sintaxe e condições de uso

fg [%número_do_trabalho]

Os colchetes descrevem um argumento opcional e não são digitados. No Bash, fg é um comando interno; confira type fg e help fg no shell usado. Outros shells podem ter diferenças de funcionamento.

Use a prática em um terminal com Bash interativo e controle de trabalhos ativo. Consulte set -o e confira se monitor está on. Um shell não interativo costuma começar com esse recurso desligado; conseguir consultar jobs não garante, por si só, que fg funcionará naquele contexto.

Trazer uma espera ao primeiro plano

  1. Na sessão de teste, execute sleep 60 &. O & inicia essa espera em segundo plano, deixando o prompt disponível. Não use um programa importante para experimentar as teclas de interrupção.
  2. Antes de a espera terminar, consulte os trabalhos na mesma sessão:
jobs -l

Localize o sleep que você criou. O número entre colchetes é o número do trabalho, enquanto a opção -l acrescenta os PIDs. Confirme também o comando e o estado. Se ele já terminou, inicie outra espera e confira o novo número antes de continuar.

  1. Traga somente esse trabalho ao primeiro plano. O exemplo usa %1; substitua-o pelo número real, como %2 para a linha [2]:
fg %1

O Bash pode apresentar o comando retomado. Enquanto sleep ainda aguarda, não há um novo prompt para digitar outro comando. Se você não pressionar nenhuma tecla de controle, a espera termina naturalmente e o prompt retorna. O formato da apresentação depende do programa; fg não é uma consulta padronizada de saúde do processo.

  1. Para observar uma suspensão, pressione Ctrl+Z antes de a espera terminar. Essa combinação de teclas normalmente suspende o trabalho em primeiro plano e devolve o prompt. Somente depois de o prompt voltar, consulte a tabela:
jobs

O trabalho de teste deve aparecer como Stopped, se ainda existir e a suspensão tiver sido aplicada. Se ele terminou antes de você pressionar as teclas, não há mais aquele trabalho para retomar. Não digite jobs enquanto o programa estiver recebendo entrada, pois o texto pode ir para esse programa em vez de ser executado pelo shell.

Ctrl+C tem outra finalidade: na configuração habitual, envia SIGINT, o sinal de interrupção, ao grupo em primeiro plano. Muitos programas encerram com esse sinal, mas podem tratá-lo ou ignorá-lo. Ctrl+Z normalmente envia SIGTSTP e suspende a execução sem encerrar o trabalho. Essas teclas dependem do terminal e de sua configuração; não são comandos de texto a colar.

Retomar um trabalho parado ou um editor

Depois de suspender a própria espera no passo anterior, confira novamente a tabela e traga o trabalho parado ao primeiro plano. Execute as duas linhas no mesmo Bash e substitua %1 pelo número verificado:

jobs
fg %1

Fg também retoma a execução quando o trabalho estava parado. Depois da retomada, deixe a espera de teste concluir; não é necessário enviar um sinal de encerramento para terminar essa prática.

O mesmo princípio serve para um editor: se Vim estiver instalado e você tiver iniciado vim notes.txt nesse Bash, suspendido o editor com Ctrl+Z e confirmado seu número em jobs, fg com essa referência devolve o editor ao primeiro plano. Use o número real do editor, que pode não ser 1. Salve e feche o arquivo pelo próprio editor; suspendê-lo não salva as alterações nem encerra a edição.

Não existe uma linha fixa de saída para essa operação: um editor pode redesenhar sua tela, enquanto sleep apenas continua aguardando. Um programa em segundo plano também pode escrever no terminal; a presença de saída, isoladamente, não prova que ele recebeu o primeiro plano. O manual de conceitos básicos de controle de trabalhos do Bash explica a relação entre trabalhos e terminal.

Escolher o trabalho correto

Formato O que seleciona
%N O trabalho número N na tabela do Bash atual.
%+ O trabalho considerado atual pelo shell, marcado com +.
%- O trabalho anterior, indicado por - quando essa referência existe.
Sem argumento O trabalho considerado atual pelo Bash.

Essas referências são específicas da tabela daquela sessão. Atual e anterior não indicam prioridade de CPU. Um pipeline pode ser um trabalho com vários processos; não substitua um especificador por um PID obtido em outra ferramenta.

Interpretar o retorno e as falhas

Quando o programa colocado em primeiro plano termina, fg retorna o estado desse programa. Portanto, um valor diferente de zero pode refletir o término do programa, mesmo quando trazê-lo ao primeiro plano funcionou. Para conferir o valor, consulte echo $? imediatamente após fg devolver o prompt, antes de executar jobs ou outro comando. O próprio comando seguinte altera o valor de $?.

Fg também falha se o controle de trabalhos estiver desligado, se o especificador não existir ou se o trabalho tiver sido iniciado sem controle de trabalhos. No teste disponível, fg sem esse recurso retornou 1 com no job control; com set -m e tabela vazia, retornou 1 com current: no such job. As condições constam no manual dos comandos internos de controle de trabalhos do Bash.

Em uma verificação com Bash 5.3.9 do Git para Windows, um shell não interativo separado ativou set -m e criou um sleep 2. O PID guardado em $! foi comparado com jobs -p %1 antes de suspender somente esse filho com STOP. Jobs -s mostrou Stopped; fg %1 retomou e aguardou a espera, retornou 0 e a consulta jobs -l posterior ficou vazia.

Em outro teste no mesmo ambiente, um novo Bash de teste criou seu próprio filho com bash -c 'sleep 1; exit 7' em segundo plano. Depois de conferir a referência, fg aguardou esse filho e retornou 7, confirmando a diferença entre o estado do programa e uma falha na seleção do trabalho. Os testes não reproduziram Ctrl+Z, Ctrl+C, a tela do Vim ou a entrada de um terminal Linux nativo.

Limites da sessão e trabalho em segundo plano

Fg não anexa um PID arbitrário nem recupera automaticamente trabalhos de outro terminal. Se a referência não existir, confira se você está no mesmo Bash e se o programa já terminou. Para retomar um trabalho parado e continuar usando o prompt, bg retoma a execução em segundo plano; programas que precisam ler do terminal podem parar novamente nesse modo.

Trazer um programa ao primeiro plano não garante sua continuidade depois de fechar o terminal. Para tarefas longas que precisam sobreviver a uma desconexão, planeje uma sessão persistente, como tmux, ou uma forma apropriada de gerenciamento de serviços. Fg apenas altera a relação do trabalho atual com o primeiro plano; não transforma o comando em serviço.

Pergunta frequente

%1 em fg %1 é um PID?

Não. %1 identifica o trabalho número 1 acompanhado pelo Bash atual. Use o número entre colchetes mostrado por jobs nessa sessão e confira qual programa ele representa. Se o trabalho acabou ou pertence a outro shell, fg não pode trazê-lo por essa referência.