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
shell
io-redirection
read
Gaurav
fonte
fonte
Respostas:
O script lê pares de cadeias de caracteres de dois arquivos. Em cada iteração, ele lê uma string de
file11
dentrolineA
e defile22
dentrolineB
. 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ãofile11
deste comando", onde "este comando" é owhile
loop. Isso também poderia ter sido escrito0<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 3file22
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 arquivofile11
(a entrada padrão é herdada do loop). Isso também poderia ter sido escritoread lineA <&0
.Com
read lineB <&3
, oread
comando lê do descritor de arquivo 3, ou seja, defile22
, 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
, usePalavras-chave:
fonte
3<file22
é como umfopen
onde oFID
não é retornado, mas pré-especificado?fdopen()
. Sim.