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 &
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 &
Respostas:
A 1
saída de padrão significa (stdout). A 2
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.
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/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, tentando curl
, curl 1>/dev/null
e curl 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.
Buscar http://www.google.com
em segundo plano e descartar o 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 &
0
, 1
E 2
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 .
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. curl
buscará 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
, 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, 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.txt
para exibir o conteúdo do arquivo na tela.
A primeira parte > /dev/null
redireciona a saída stdout
, que é curl
para /dev/null
(mais adiante) e 2>&1
redireciona a stderr
para a stdout
(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 distinguir stdout (1)
ou stderr (2)
dos arquivos nomeados 1
ou 2
. Então, 2>1
acabaria criando um novo arquivo (se já não existir) nomeado 1
e despejar o stderr
resultado 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/null
está efetivamente suprimindo curl
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 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>&1
ignora as informações de curl
saída e curl
progresso 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 jobs
seu terminal. Observe que isso é diferente dos processos em execução no seu sistema. Para ver esses tipos top
no terminal.
/dev/null
? Você não quer que os resultados do curl
pelo 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 > logfile
2> & 1