Qual é o significado de "<& 3" e "done <file11 3 <file22"

16

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
Gaurav
fonte
11
Você poderia nos explicar o que faz o script? (Você diz que está funcionando bem)
Mathieu

Respostas:

22

O script lê pares de cadeias de caracteres de dois arquivos. Em cada iteração, ele lê uma string de file11dentro lineAe de file22dentro lineB. Faz isso até encontrar o final de qualquer arquivo. O corpo do loop gera as duas strings e uma linha em branco.

Os <file11meios "conectar / redirecionar a entrada padrão file11deste comando", onde "este comando" é o whileloop. 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<file22meios "conectar o descritor de arquivo 3 file22para 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 lineAlerá 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 readcomando 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 file22arquivo.

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:

Kusalananda
fonte
Boa resposta! O que não entendo é como o descritor de arquivos 3 pode ser usado. Isso significa que 3<file22é como um fopenonde o FIDnão é retornado, mas pré-especificado?
A. Donda
2
@ A.Donda Você está descrevendo fdopen(). Sim.
Kusalananda