Diferença entre descritor de arquivo e arquivo vinculado a um arquivo

3

Eu tenho um arquivo que contém quatro linhas:

$ cat file
First line
Second line
Third line
Fourth line
$ 

Quando leio esse arquivo quatro vezes, sempre leio a primeira linha que é um resultado esperado:

$ for i in {1..4}; do read line <file; echo "$line" ; done
First line
First line
First line
First line
$ 

No entanto, quando eu vinculo o descritor de arquivo 3 com file e, em seguida, o leio da mesma forma, cada um lê "come" o fluxo de entrada:

$ exec 3<file
$ for i in {1..4}; do read -u 3 line; echo "$line" ; done
First line
Second line
Third line
Fourth line
$

Por que os descritores de arquivos se comportam assim?

    
por Martin 29.05.2017 / 22:01

2 respostas

4

Quando você diz: read var <file , o descritor de arquivo é fechado quando o comando é concluído. Assim, da próxima vez no loop, o descritor de arquivo é redefinido para o início.

No caso de exec 3<file , quando você diz read -r -u 3 var , o descritor de arquivo permanece aberto mesmo quando o comando read termina E a posição de leitura é atualizada, então na próxima vez, a leitura irá pegar a próxima linha. p>

Observação: mesmo se você tivesse feito, exec 0<file e, em seguida, read -r var , ainda se comportaria de maneira semelhante.

    
por 29.05.2017 / 22:17
3

A resposta rápida é que eles são projetados para funcionar - um descritor de arquivo contém um estado, que inclui uma posição de leitura e gravação. Cada leitura realizada em um descritor de arquivo move a posição de leitura, não importa quem esteja lendo a partir dela - o descritor de arquivo contém apenas uma posição de leitura.

De outra forma, quando um descritor de arquivo é criado (pelo SO), ele também cria uma estrutura / tabela que contém essas variáveis de estado. Há apenas uma cópia da posição de leitura na tabela, e toda vez que a função read () é chamada no descritor de arquivo, a variável de posição de leitura única é atualizada.

    
por 29.05.2017 / 22:06