Administração de Linux
medium

Administração de Linux Question #019e3987

Question Statement
Administração de Linux
#shell-redirection
#stdout
#stderr
#file-descriptor
#2>&1
Medium

Qual dos seguintes redirecionamentos do shell gravará a saída padrão e a saída de erro padrão em um arquivo chamado filename?

A

2>&1 >filename

B

filename 2>&1

Correct
C

1>&2>filename

D

filename

E

1&2>filename

Official Explanation / Community Explanations

O redirecionamento correto do shell para escrever tanto a saída padrão (stdout) quanto o erro padrão (stderr) em um arquivo chamado filename é >filename 2>&1. Isso funciona redirecionando primeiro stdout para o arquivo e, em seguida, redirecionando stderr (descritor de arquivo 2) para onde stdout (descritor de arquivo 1) estiver apontando no momento, que é o arquivo.

Como funciona

  • >filename redireciona o descritor de arquivo 1 (stdout) para o arquivo filename.
  • 2>&1 redireciona o descritor de arquivo 2 (stderr) para o destino atual do descritor de arquivo 1, que agora é o arquivo.
  • A ordem é crucial: stdout deve ser redirecionado para o arquivo antes que stderr seja redirecionado para stdout.

Por que o valor correto está certo

  • >filename 2>&1 combina corretamente os dois fluxos no arquivo porque os redirecionamentos são avaliados da esquerda para a direita. Primeiro, stdout é enviado para o arquivo; em seguida, stderr é enviado para o mesmo local que stdout (o arquivo).

Por que os valores incorretos estão errados

  • 2>&1 >filename redireciona stderr para o stdout atual (que é o terminal por padrão) e, em seguida, redireciona stdout para o arquivo. Como resultado, apenas stdout vai para o arquivo; stderr ainda vai para o terminal.
  • 1>&2>filename é sintaticamente inválido. A sintaxe correta para duplicar um descritor de arquivo é n>&m, não n>&m>filename. Isso seria interpretado como redirecionar stdout para stderr, seguido de uma tentativa de redirecionar algo para um arquivo, mas a sintaxe está incorreta.
  • >>filename anexa stdout ao arquivo, mas não redireciona stderr; stderr permanece no terminal.
  • 1&2>filename é sintaticamente inválido. O caractere '&' deve ser colocado antes do número do descritor de arquivo em um redirecionamento duplicado (por exemplo, 2>&1), não depois. Isso seria interpretado como redirecionar o descritor de arquivo 1 para um arquivo chamado 2>filename? Na verdade, 1&2>filename é ambíguo e não é uma sintaxe válida do shell.