O Que É um File Descriptor? Identificadores Numerados para I/O
Um file descriptor é um pequeno inteiro que o sistema operacional usa como identificador para um arquivo, socket ou fluxo aberto dentro de um processo.
Nos bastidores, todo arquivo ou fluxo aberto em um processo é referido por um número chamado file descriptor. Os três que você encontra mais são 0, 1 e 2: stdin, stdout e stderr. Entender descriptors explica os redirecionamentos de aparência enigmática como 2>&1 que aparecem por todos os scripts de CI.
O que é um file descriptor
Quando um processo abre um arquivo, o kernel retorna um pequeno inteiro que o identifica. O processo usa esse número para cada leitura ou escrita. Descriptors são por processo, então o mesmo número significa coisas diferentes em programas diferentes.
Os três descriptors padrão
- 0 é stdin, o fluxo de entrada.
- 1 é stdout, o fluxo de saída normal.
- 2 é stderr, o fluxo de erro.
Redirecionando por número
Você redireciona um fluxo pelo número do seu descriptor. 2> errors.log envia o descriptor 2 (stderr) para um arquivo. 2>&1 faz o descriptor 2 apontar para onde o descriptor 1 aponta no momento, fundindo os fluxos.
Descriptors mais altos
Além de 0, 1 e 2, um processo pode abrir muitos outros arquivos, obtendo os descriptors 3, 4 e assim por diante. Scripts avançados às vezes abrem descriptors extras, mas a maior parte do trabalho de CI só toca os três padrão.
File descriptors em CI
Ler e escrever logs em CI é todo trabalho de descriptor. Saber que > out.log 2>&1 redireciona stdout para um arquivo e então aponta stderr para o mesmo lugar é a chave para capturar logs completos de um step de build.
Tratamento de fluxos em runners gerenciados
Os runners da Latchkey conectam automaticamente o stdout e stderr do seu step ao log do job. Quando você precisa da saída completa de um step em um arquivo também, os redirecionamentos de descriptor padrão funcionam exatamente como localmente.
Principais conclusões
- Um file descriptor é um identificador numérico para um arquivo ou fluxo aberto.
- Os descriptors 0, 1 e 2 são stdin, stdout e stderr.
- Redirecionamentos como
2>&1operam sobre esses números para rotear logs de CI.