Eu tenho o seguinte script:
while read lineA && read lineB <&3
do
echo "$lineA"
echo "$lineB"
echo
done < file11 3< file22
Este código está funcionando bem. Mas eu não entendo isso:
<&3
done < file11 3< file22
Eu tenho o seguinte script:
while read lineA && read lineB <&3
do
echo "$lineA"
echo "$lineB"
echo
done < file11 3< file22
Este código está funcionando bem. Mas eu não entendo isso:
<&3
done < file11 3< file22
Respostas:
O script lê pares de cadeias de caracteres de dois arquivos. Em cada iteração, ele lê uma string de file11
dentro lineA
e de file22
dentro lineB
. Faz isso até encontrar o final de qualquer arquivo. O corpo do loop gera as duas strings e uma linha em branco.
Os <file11
meios "conectar / redirecionar a entrada padrão file11
deste comando", onde "este comando" é o while
loop. Isso também poderia ter sido escrito 0<file11
.
A entrada padrão é o número descritor de arquivo 0. Os descritores de arquivo 1 e 2 são reservados para a saída padrão e os fluxos de erro padrão.
Os 3<file22
meios "conectar o descritor de arquivo 3 file22
para este comando". O número 3 é o próximo número de descritor de arquivo "gratuito", mas o código poderia ter usado 4 ou 5 ou qualquer número inteiro pequeno que não seja 0, 1 e 2 (o limite dos números de descritores de arquivos utilizáveis depende de qual shell é sendo usados, mas é garantido que números de até 9 funcionem).
No loop, read lineA
lerá uma string da entrada padrão por padrão, ou seja, do arquivo file11
(a entrada padrão é herdada do loop). Isso também poderia ter sido escrito read lineA <&0
.
Com read lineB <&3
, o read
comando lê do descritor de arquivo 3, ou seja, de file22
, e não da entrada padrão (o descritor de arquivo 3 está disponível no loop, assim como a entrada padrão).
Em resumo, ele usa o fluxo de entrada padrão e um descritor de arquivo "extra" (número 3) para ler dois arquivos "simultaneamente" (uma sequência de cada vez de cada arquivo). Normalmente, só se tem acesso a um fluxo de entrada, mas isso ignora essa restrição criando explicitamente um segundo fluxo de entrada e conectando-o ao file22
arquivo.
Palavras-chave:
Eu uso a palavra "string" acima em vez de "line". As coisas lidas nos dois arquivos terão espaços em branco nos flancos, e certas seqüências de escape serão interpretadas especialmente.
Para ler uma linha usando read
, use
IFS= read -r varname
Palavras-chave:
3<file22
é como um fopen
onde o FID
não é retornado, mas pré-especificado?
fdopen()
. Sim.