Estou lutando para entender o redirecionamento de IO no bash. Eu vi muitos exemplos como o seguinte (que é literalmente retirado da resposta aceita aqui ):
exec 3<> /tmp/foo #open fd 3.
echo "test" >&3
exec 3>&- #close fd 3.
Não entendi a segunda linha. Para ser preciso, não entendo como seu comportamento está de acordo com o manual do bash.
Obviamente, na segunda linha, >&3
deve redirecionar stdout
(e possivelmente stderr
- não sei) para o descritor de arquivo 3; todo o resto não faria sentido.
Mas do manual atual do bash (no momento em que escrevo), seção 3.6.4 (formatando o meu):
Essa construção permite que tanto a saída padrão (descritor de arquivo 1) quanto a saída de erro padrão (descritor de arquivo 2) sejam redirecionadas para o arquivo cujo nome é a expansão de word. Existem dois formatos para redirecionar a saída padrão e o erro padrão:
&>word
e>&word
[ Em seguida, explica diferenças sutis entre o primeiro e o segundo formato, mas vamos deixar isso de lado por um momento porque não é importante para a pergunta. ]
No meu entendimento, isso diz que >&3
redireciona stderr
e stdout
para um arquivo cujo nome é 3
, que é bem diferente de redirecionar stdout
(e possivelmente stderr
) para descritor de arquivo 3
.
Alguém poderia explicar o que estou perdendo?
Na verdade, é precisamente a parte que você deixa de lado que é mais relevante (da documentação do GNU bash ):
Essa nota final é a parte mais importante, então vou repeti-la aqui:
Portanto, se
word
expande para um número ou-
, regras especiais são acionadas. As strings se expandem para si mesmas, portanto,3
pode-se dizer que "expandem", o3
que significa que>&3
são tratadas de acordo com as regras descritas na seção Duplicando Descritores de Arquivos :Tudo isso para dizer que, no caso específico em que o que vem depois do
>&
é um número, esse número é considerado um descritor de arquivo. Presumivelmente, é exatamente por isso que o manual afirma que&>word
é preferível ao equivalente,>&word
pois&>word
é inequívoco.