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>&1na linha de comando. Por exemplo:
curl http://www.google.com > /dev/null 2>&1 &
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>&1na linha de comando. Por exemplo:
curl http://www.google.com > /dev/null 2>&1 &
Respostas:
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.
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.
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?
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.
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 &
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.

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.
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é 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.

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.
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.
/dev/null? Você não quer que os resultados do curlpelo menos em algum lugar sejam úteis?
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