A maioria dos comandos tem um único canal de entrada (entrada padrão, descritor de arquivo 0) e um único canal de saída (saída padrão, descritor de arquivo 1) ou então opera em vários arquivos que eles mesmos abrem (assim você passa um nome de arquivo ). (Isso é um acréscimo do erro padrão (fd 2), que geralmente é filtrado até o usuário.) No entanto, às vezes é conveniente ter um comando que atua como um filtro de várias origens ou para vários destinos. Por exemplo, aqui está um script simples que separa as linhas ímpares em um arquivo das linhas pares
while IFS= read -r line; do
printf '%s\n' "$line"
if IFS= read -r line; then printf '%s\n' "$line" >&3; fi
done >odd.txt 3>even.txt
Agora, suponha que você queira aplicar um filtro diferente às linhas de números ímpares e às linhas pares (mas não colocá-las juntas novamente, isso seria um problema diferente, não viável do shell em geral). No shell, você só pode canalizar a saída padrão de um comando para outro comando; para canalizar outro descritor de arquivo, você precisa redirecioná-lo para o fd 1 primeiro.
{ while … done | odd-filter >filtered-odd.txt; } 3>&1 | even-filter >filtered-even.txt
Outro caso de uso mais simples é que filtra o erro saída de um comando .
exec M>&N
redireciona um descritor de arquivo para outro para o restante do script (ou até que outro comando altere os descritores de arquivo novamente). Há alguma sobreposição na funcionalidade entre exec M>&N
e somecommand M>&N
. A forma exec
é mais poderosa, pois não precisa ser aninhada:
exec 8<&0 9>&1
exec >output12
command1
exec <input23
command2
exec >&9
command3
exec <&8
Outros exemplos que podem ser de interesse:
- O que significa “3 > & 1 1 > & 2 2 > & 3; faça em um script? (troca stdout por stderr)
- Descritores de arquivos & script de shell
- Qual é o tamanho do buffer de tubos?
- Teste de script Bash se um o comando foi executado corretamente
E ainda mais exemplos:
- perguntas marcadas com
io-redirection
- perguntas marcadas com
file-descriptors
- procure exemplos em este site no Data Explorer (uma cópia pública somente leitura do banco de dados do Stack Exchange)
P.S. Esta é uma pergunta surpreendente vinda do autor do post mais votado no site que usa redirecionamento por meio do fd 3 !