Dados os 3 scripts a seguir:
printf 'a\nb\nc\n' > file && { head -n 1; cat; } < file
printf 'a\nb\nc\n' | { head -n 1; cat; }
{ head -n 1; cat; } < <(printf 'a\nb\nc\n')
Eu esperaria que a saída de cada um fosse:
a
b
c
mas para alguns deles, em alguns sistemas, esse não é o caso. Por exemplo, no cygwin:
$ printf 'a\nb\nc\n' > file && { head -n 1; cat; } < file
a
b
c
$ printf 'a\nb\nc\n' | { head -n 1; cat; }
a
$ { head -n 1; cat; } < <(printf 'a\nb\nc\n')
a
O que está causando a saída diferente desses scripts?
Informações adicionais - aparentemente, isso não é apenas um head
problema:
$ printf 'a\nb\nc\n' | { sed '1q'; cat; }
a
$ printf 'a\nb\nc\n' | { awk '1;{exit}'; cat; }
a
$ { sed '1q'; cat; } < <(printf 'a\nb\nc\n')
a
$ { awk '1;{exit}'; cat; } < <(printf 'a\nb\nc\n')
a
Qual seria uma maneira POSIX robusta no shell (ou seja, sem apenas invocar awk ou similar uma vez para fazer tudo) para ler um certo número de linhas da entrada e deixar o restante para um comando diferente, independentemente de a entrada vir de um canal ou um arquivo?
Esta pergunta foi inspirada por comentários em uma resposta para classificar todo o .csv com base no valor de uma determinada coluna .