Usar os comandos de agrupamento é certo para fazer esse trabalho, mas o culpado é a entrada que você coloca nos comandos de agrupamento, o que não é possível.
O POSIX define na seção INPUT FILE
que:
When a standard utility reads a seekable input file and terminates
without an error before it reaches end-of-file, the utility shall
ensure that the file offset in the open file description is properly
positioned just past the last byte processed by the utility. For files
that are not seekable, the state of the file offset in the open file
description for that file is unspecified
perl
não é um utilitário padrão, mas há uma grande chance de seguir as especificações padrão. Se você tornar seu arquivo pesquisável, ele funcionará:
$ seq 13 > /tmp/test
$ {perl -e 'for($i=0;$i<10;$i++){$line = <STDIN>;print $line}'; cat;} </tmp/test
1
2
3
4
5
6
7
8
9
10
11
12
13
Se você não quiser usar o arquivo pesquisável, poderá forçar perl
a usar a camada inferior que a função de chamadas do sistema de chamadas read()
, write()
, lseek()
para IO:
$ seq 13 | {
PERLIO=:unix perl -e 'for($i=0;$i<10;$i++){$line = <STDIN>;print $line}'
cat
}