Por que o comando cat lê apenas o primeiro descritor de arquivo?

1

No console, criei dois arquivos vazios e tentei lê-los simultaneamente.

$ echo -n '' | tee f1 > f2
$ cat f1 f2
$ cat <(tail -f f1) <(tail -f ./f2)

No outro console, executei meus testes.

$ echo 'tee test' | tee -a f1 >> f2
$ echo 'f1 test' >> f1
$ echo 'f2 test' >> f2
$ cat f1 f2
tee test
f1 test
tee test
f2 test

No entanto, cat no primeiro console só lê as saídas do primeiro fd .

$ cat <(tail -F ./f1) <(tail -F ./f2)
tee test
f1 test

Por quê? Como leio simultaneamente a partir de dois ou mais descritores de arquivo?

    
por NarūnasK 20.10.2017 / 16:32

2 respostas

6

cat processa seus argumentos sequencialmente; tail -f f1 continua em execução, por isso cat continua esperando pela entrada em <(tail -f f1) e não passa para o processamento <(tail -f f2) .

Você verá a saída de tail -f f2 se você matar o primeiro tail .

Uma ferramenta melhor para rastrear vários arquivos simultaneamente é tail (pelo menos, GNU tail ):

tail -f f1 f2

Se você não quiser ver os cabeçalhos de arquivo, use -q :

tail -qf f1 f2
    
por 20.10.2017 / 16:40
2

cat a b não lê simultaneamente de a e b ; ele abre a , lê-lo do início ao fim, fecha a e, em seguida, passa a fazer o mesmo com o próximo arquivo foi dado como um argumento.

No caso em que os argumentos são pseudo-arquivos que fazem tail -f e portanto, não tem um "fim", cat só iria ler o primeiro arquivo.

Se, por algum motivo, você só precisar abrir muitos arquivos de uma só vez, paste poderia ser um caminho:

$ echo f1 >f1; echo f2 >f2
$ cat <(tail -F f1) <(tail -F f2)
f1
^C

$ paste <(tail -F f1) <(tail -F f2)
f1      f2
^C
    
por 20.10.2017 / 16:40