O que “2 & 1” faz na linha de comando?

58

Eu sei que o sinal > é usado para redirecionamento de saída na linha de comando, mas estou tendo problemas para encontrar algo que explique o uso de 2>&1 na linha de comando. Por exemplo:

curl http://www.google.com > /dev/null 2>&1 &
    
por Matt Huggins 17.11.2009 / 00:15

4 respostas

75

O 1 denota a saída padrão (stdout). O 2 denota erro padrão (stderr).

Então 2>&1 diz para enviar erro padrão para onde a saída padrão também está sendo redirecionada. Que desde que está sendo enviado para /dev/null é como ignorar qualquer saída.

    
por 17.11.2009 / 00:17
22

tl; dr

Busque http://www.google.com no plano de fundo e descarte os stdout e stderr .

curl http://www.google.com > /dev/null 2>&1 &

é o mesmo que

curl http://www.google.com > /dev/null 2>/dev/null &

Noções básicas

0 , 1 e 2 representam o arquivo padrão descritores em POSIX sistemas operacionais. Um descritor de arquivo é uma referência do sistema para (basicamente) um arquivo ou soquete .

A criação de um novo descritor de arquivo em C pode ser algo assim:

fd = open("data.dat", O_RDONLY)

A maioria dos comandos do sistema Unix recebe alguma entrada e envia o resultado para o terminal. curl buscará o que estiver na URL especificada ( google dot com ) e exibir o resultado para stdout .

Redirecionamento

Comovocêdisse,<e>sãousadospararedirecionarasaídadeumcomandoparaoutrolugar,comoumarquivo.

Porexemplo,emls>myfiles.txt, ls obtém o conteúdo do diretório atual e > redireciona sua saída para myfiles.txt (se o arquivo não existir, ele será criado, sobrescrito, mas você pode usar >> em vez de > para acrescentar ao arquivo). Se você executar o comando acima, você notará que nada é exibido no terminal. Isso geralmente significa sucesso em sistemas Unix. Para verificar este cat myfiles.txt para exibir o conteúdo do arquivo na tela.

> / dev / null 2 > & 1

A primeira parte > /dev/null redireciona a stdout , que é curl para /dev/null (mais adiante) e 2>&1 redireciona stderr para stdout (que foi apenas redirecionado para /dev/null , então tudo será enviado para /dev/null ).

O lado esquerdo de 2>&1 diz a você que o que será redirecionado, e o lado direito diz onde a. O & é usado no lado direito para distinguir stdout (1) ou stderr (2) dos arquivos denominados 1 ou 2 . Portanto, 2>1 acabaria criando um novo arquivo (se já não existir) chamado 1 e despejaria o resultado stderr lá.

/ dev / null

/dev/null é um arquivo vazio, um mecanismo usado para descartar tudo escrito nele. Assim, curl http://www.google.com > /dev/null está efetivamente suprimindo a saída de curl .

Masporqueaindaháalgumascoisasexibidasnoterminal?.Estanãoéasaídaregularnãocurl,masosdadossãoenviadosparaostderr,usadoaquiparaexibirinformaçõesdeprogressoediagnósticoenãoapenaserros.

curlhttp://www.google.com>/dev/null2>&1ignoraasaídadecurleasinformaçõesdeprogressodecurls.Oresultadoéquenadaéexibidonoterminal.

Finalmente

O&nofinalécomovocêdizaoshellparaexecutarocomandocomoum trabalho no < um plano de fundo . Isso faz com que o prompt retorne imediatamente enquanto o comando é executado de forma assíncrona nos bastidores. Para ver os trabalhos atuais, digite jobs em seu terminal. Observe que isso é diferente do processos em execução no seu sistema. Para ver esse tipo top no terminal.

Referências

por 30.11.2014 / 07:35
4

2 refere-se a STDERR. 2>&1 enviará STDERR para o mesmo local que 1 (STDOUT).

    
por 17.11.2009 / 00:20
0

Eu entendo como segue:

Se você quiser apenas ler as informações de Saída e Erro do comando na tela, basta escrever: curl http://www.google.com

E, algumas vezes, você deseja salvar as informações de saída em um arquivo, em vez de na tela do terminal, para uma revisão posterior. Em seguida, você pode escrever: curl http://www.google.com > logfile

Mas, desta forma, as informações StdErr serão omitidas, pois > somente redireciona o StdOut para logfile .

Portanto, se você se preocupa com as informações de erro do comando depois que ele falha na execução, é necessário combinar StdOut com StdErr usando 2>&1 (o que significa dobrar StdErr no StdOut), para que a linha de comando a seguir seja gravada : curl http://www.google.com > logfile 2 > & 1

    
por 06.12.2013 / 09:08