Intro
Às vezes vemos comandos como este na shell:
- $ ls foo > /dev/null 2>&1
Pode ser difícil compreender o que isto está a fazer pela primeira vez, por isso esta nota irá explicá-lo brevemente.
>
I/O Redirecção
Se tiver agora um ficheiro de texto simples:
Ocorreu um erro durante o processo de redirecionamento porque não há nenhum arquivo com o nome no_such_file.txt no diretório atual. Neste caso, embora o comando > seja usado, não é possível inserir o conteúdo no output.txt, pois não há conteúdo stdout, mas sim uma mensagem de erro de stderror.
Descritor de ficheiro
Descritor de ficheiro pode ser pensado como um inteiro positivo para um ficheiro aberto. Se você tem 100 arquivos abertos, você tem basicamente 100 descritores de arquivo correspondentes.
Em sistemas do tipo Unix/Unix, há também descritores de arquivo dedicados a stdout e stderr, que, para ser claro, têm destinos dedicados para a saída destespara estes destinos de saída:
- 1: para stdout
- 2: para stderr
Pondo tudo junto
De acordo com o conceito acima, se você quiser escrever o conteúdo de um arquivo conhecido para outro arquivo, você pode fazer isso
>
O 1 deste lado representa stdout, cuja sintaxe é representada como:
- >
Então, quando você vê alguém escrever de.foo > a.bar, é só omitir o
Likewise, para redireccionar a stderr você pode fazer isto:
Se quiser redireccionar tanto stdout como stderr para o mesmo destino, pode fazer isto
>
- &1 é usado como referência a um descritor de arquivo id de 1, ou seja, uma referência a stdout.
- 2>&1 significa redirecionar o conteúdo da stderr para stdout.
Resumo
- Existem normalmente dois destinos para a saída: stdout e stderr.
- Podemos direcionar a saída para lugares diferentes, mas normalmente para um arquivo.
- Descritor de ficheiro pode ser usado para distinguir entre stdout (1) e stderr (2).
- command > output_location é na verdade uma abreviatura de comando 1> output_location.
- Podemos usar & para consultar outros descritores de ficheiro.