Eu tenho usado o seguinte para iniciar programas a partir de terminais:
program_name >/dev/null 2>&1 &
Mas recentemente me deparei com esta página da Web onde o seguinte método foi recomendado:
program_name </dev/null &>/dev/null &
Agora, eu sei o que o primeiro significa. Significa apontar stderr para stdout e stdout para /dev/null, ou seja, stderr e stdout agora são apontados para null.
Mas o que significa o segundo? E qual é mais adequado para iniciar programas sem cabeça a partir do terminal?
Há, por padrão, três arquivos "padrão" abertos quando você executa um programa, entrada padrão (
stdin
), saída padrão (stdout
) e erro padrão (stderr
). No Unix, eles estão associados a "descritores de arquivo" (stdin
= 0,stdout
= 1,stderr
= 2). Por padrão, todos os três estão associados ao dispositivo que controla seu terminal (a interface pela qual você vê o conteúdo na tela e digita a entrada no programa).O shell oferece a capacidade de "redirecionar" os descritores de arquivo. O
>
operador redireciona a saída; a<
entrada de redirecionamentos.Por exemplo:
O que equivale a:
Redireciona a saída para o descritor de arquivo 1 ('stdout') para `/dev/null'
Da mesma forma,
Redireciona a saída para o descritor de arquivo 2 ('stderr') para '/dev/null'
Você pode querer redirecionar ambos
stdout
estderr
para um único arquivo, então você pode pensar que faria:Mas isso não lida com gravações intercaladas nos descritores de arquivo (os detalhes por trás disso são uma questão diferente). Para resolver isso, você pode fazer:
Que diz "redirecionar gravações no descritor de arquivo 1
/dev/null
e redirecionar gravações no descritor de arquivo 2 para o mesmo local em que as gravações no descritor de arquivo 1 estão indo". Isso lida com gravações intercaladas nos descritores de arquivo.Essa opção é tão comum que alguns shells incluem um atalho que é mais curto e funcionalmente equivalente:
Por fim, você pode redirecionar a entrada da mesma maneira que redireciona a saída:
Redirecionará o descritor de arquivo 0 (
stdin
) de/dev/null
, portanto, se o programa tentar ler a entrada, ele obterá EOF.Juntando tudo isso:
Digamos que (1) execute
program_name
, (2) redirecione a entrada padrão de/dev/null
(</dev/null
), (3) redirecione os descritores de arquivo 1 e 2 (stdout
estderr
) para/dev/null
(&>/dev/null
) e (4) execute o programa em segundo plano (&
).Para > /dev/null Você está realmente anulando a coisa.
Enquanto para 2>&1 Você está redirecionando qualquer texto de fluxo de erro para o fluxo de saída. Isso será melhor entendido quando alguém tentar executar um comando que realmente gera erro quando executado. Basta usar esse comando duas vezes uma vez como está e outra vez com 2>&1 poste seu comando.
Espero que isso ajude pelo menos usuários iniciantes. Obrigado.