O que "2> & 1" faz na linha de comando?

Respostas:

78

A 1saída de padrão significa (stdout). A 2denota o erro padrão (stderr).

É o que 2>&1diz para enviar um erro padrão para onde a saída padrão também está sendo redirecionada. O qual, desde que está sendo enviado, /dev/nullé semelhante a ignorar qualquer saída.

Chealion
fonte
2
Existe uma razão para que um e comercial apareça antes do 1, mas não antes do 2? Eu pensei que o & era um personagem reservado para executar um trabalho em segundo plano, mas acho que é apenas se oe comercial aparecer como um caractere longo no final de um comando ...?
Matt Huggins
8
Como 0(stdin), 1(stdout) e 2(stderr) são na verdade descritores de arquivo, o shell requer um e comercial colocado na frente deles para redirecionamento. Duplica o descritor de arquivo nesse caso, mesclando efetivamente os dois fluxos de informações.
Chealion
12
Pense desta maneira: se você tivesse "1" sem e comercial, o shell criaria um arquivo chamado "1" e redirecionaria a saída stderr para ele.
CarlF
11
Ok, isso sozinho seria válido então? curl http://www.google.com 2>/dev/nullComo a linha de comando sabe que o "2" aqui significa stderr e não é realmente o segundo parâmetro que estou passando para o comando curl?
22630 Matt Huggins #
11
@ Matt Huggins: Sim. Isso enviaria toda a saída de stderrdireto para em /dev/nullvez disso. Você pode vê-lo na prática, tentando curl, curl 1>/dev/nulle curl 2>/dev/nullapenas para ver a saída mudar. Novamente, o e comercial é necessário apenas para o descritor de arquivo que está sendo redirecionado.
Chealion 18/11/2009
23

tl; dr

Buscar http://www.google.comem segundo plano e descartar o stdoute stderr.

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

é o mesmo que

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

Fundamentos

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

Criar um novo descritor de arquivo em C pode ser algo como isto:

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

A maioria dos comandos do sistema Unix recebe alguma entrada e gera o resultado no terminal. curlbuscará o que estiver no URL especificado ( google dot com ) e exibirá o resultado em stdout.

resultado de ondulação

Redirecionamento

Como você disse <e >é usado para redirecionar a saída de um comando para outro lugar, como um arquivo.

Por exemplo, in ls > myfiles.txt, lsobté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, caso contrário, será substituído, mas você poderá usar em >>vez de >anexá-lo). Se você executar o comando acima, notará que nada é exibido no terminal. Isso geralmente significa sucesso em sistemas Unix. Marque esta opção cat myfiles.txtpara exibir o conteúdo do arquivo na tela.

> / dev / null 2> & 1

A primeira parte > /dev/nullredireciona a saída stdout, que é curlpara /dev/null(mais adiante) e 2>&1redireciona a stderrpara a stdout(que foi redirecionada apenas para /dev/nullque tudo seja enviado para /dev/null).

O lado esquerdo 2>&1indica o que será redirecionado e o lado direito indica para onde . O &é usado no lado direito para distinguir stdout (1)ou stderr (2)dos arquivos nomeados 1ou 2. Então, 2>1acabaria criando um novo arquivo (se já não existir) nomeado 1e despejar o stderrresultado lá.

/ dev / null

/dev/nullé um arquivo vazio, um mecanismo usado para descartar tudo o que está escrito nele. Então, curl http://www.google.com > /dev/nullestá efetivamente suprimindo curla saída.

> / dev / null

Mas por que ainda existem algumas coisas exibidas no terminal? Esta não curl é a saída regular, mas os dados enviados para stderr, usados ​​aqui para exibir informações de progresso e diagnóstico e não apenas erros .

curl http://www.google.com > /dev/null 2>&1ignora as informações de curlsaída e curlprogresso de ambos . O resultado é que nada é exibido no terminal.

Finalmente

O &final é como você diz ao shell para executar o comando como um trabalho em segundo plano . Isso faz com que o prompt retorne imediatamente enquanto o comando é executado de forma assíncrona nos bastidores. Para ver os trabalhos atuais, digite jobsseu terminal. Observe que isso é diferente dos processos em execução no seu sistema. Para ver esses tipos topno terminal.

Referências

Jorge Bucaran
fonte
11
Esta é uma das melhores respostas em todo o site de uma perspectiva de layout, muito bem!
OmarOthman
Uma coisa que não estou entendendo é por que você gostaria de enviar tudo /dev/null? Você não quer que os resultados do curlpelo menos em algum lugar sejam úteis?
Skype #
@skube Certo. Nesse caso, não está claro para mim por que o usuário deseja descartar stdout e stderr. O OP provavelmente só queria entender o que significava a sintaxe.
Jorge Bucaran
5

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

John T
fonte
0

Meu entender da seguinte forma:

Se você deseja 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 da tela do terminal, para revisão posterior, e pode escrever: curl http://www.google.com > logfile

Mas, dessa maneira, as informações de StdErr serão omitidas, pois >apenas redirecionam o StdOut para logfile.

Portanto, se você se importa com as informações de erro do comando, uma vez que ele falha na execução, é necessário combinar o StdOut com o StdErr usando 2>&1(o que significa dobrar StdErr no StdOut), para que a seguinte linha de comando possa ser escrita: curl http://www.google.com > logfile2> & 1

YaOzI
fonte