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 &
command-line
shell
redirection
Matt Huggins
fonte
fonte
Respostas:
A
1
saída de padrão significa (stdout). A2
denota o erro padrão (stderr).É o que
2>&1
diz 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.fonte
0
(stdin),1
(stdout) e2
(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/null
Como 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?stderr
direto para em/dev/null
vez disso. Você pode vê-lo na prática, tentandocurl
,curl 1>/dev/null
ecurl 2>/dev/null
apenas para ver a saída mudar. Novamente, o e comercial é necessário apenas para o descritor de arquivo que está sendo redirecionado.tl; dr
Buscar
http://www.google.com
em segundo plano e descartar ostdout
estderr
.é o mesmo que
Fundamentos
0
,1
E2
representam os arquivos padrão descritores em POSIX sistemas operacionais. Um descritor de arquivo é uma referência do sistema a (basicamente) um arquivo ou soquete .0 stdin
1 stdout
2 stderr
Criar um novo descritor de arquivo em C pode ser algo como isto:
A maioria dos comandos do sistema Unix recebe alguma entrada e gera o resultado no terminal.
curl
buscará o que estiver no URL especificado ( google dot com ) e exibirá o resultado emstdout
.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
,ls
obtém o conteúdo do diretório atual e>
redireciona sua saída paramyfiles.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çãocat myfiles.txt
para exibir o conteúdo do arquivo na tela.> / dev / null 2> & 1
A primeira parte
> /dev/null
redireciona a saídastdout
, que écurl
para/dev/null
(mais adiante) e2>&1
redireciona astderr
para astdout
(que foi redirecionada apenas para/dev/null
que tudo seja enviado para/dev/null
).O lado esquerdo
2>&1
indica o que será redirecionado e o lado direito indica para onde . O&
é usado no lado direito para distinguirstdout (1)
oustderr (2)
dos arquivos nomeados1
ou2
. Então,2>1
acabaria criando um novo arquivo (se já não existir) nomeado1
e despejar ostderr
resultado 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/null
está efetivamente suprimindocurl
a saída.Mas por que ainda existem algumas coisas exibidas no terminal? Esta não
curl
é a saída regular, mas os dados enviados parastderr
, usados aqui para exibir informações de progresso e diagnóstico e não apenas erros .curl http://www.google.com > /dev/null 2>&1
ignora as informações decurl
saída ecurl
progresso 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, digitejobs
seu terminal. Observe que isso é diferente dos processos em execução no seu sistema. Para ver esses tipostop
no terminal.Referências
fonte
/dev/null
? Você não quer que os resultados docurl
pelo menos em algum lugar sejam úteis?2
refere-se a STDERR.2>&1
enviará STDERR para o mesmo local que1
(STDOUT).fonte
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 paralogfile
.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 > logfile
2> & 1fonte