Suponha que eu tenha:
** EDIT TO HAVE CLOSER CORRESPONDENCE TO ACTUAL USAGE **
find ... -regex ... | head -n 1 | xargs -I {} zcat {} | head -n 1
# next, I do some other things
agora tudo funciona corretamente. No entanto, o xargs -I {} zcat {}
comando gera o seguinte erro:
xargs: zcat: terminated by signal 13
O que é algo que posso ignorar para efeitos do que estou tentando fazer. No entanto, se eu executar o código e canalizá-lo para a less
, a xargs: zcat: terminated by signal 13
instrução será a primeira linha. Isto não é desejável. Existe uma maneira de suprimir ou capturar esse aviso/erro que não é um erro?
Responder1
O erro ocorre devido ao zcat
envio de um PIPE
sinal para ele. Isso acontece porque na segunda vez que zcat
é executado (e em todas as outras vezes depois disso, uma vez para cada arquivo, exceto o primeiro), ele tenta escrever no pipe para head
depois de head
ter saído (devido a ter concluído sua tarefa de gerar a primeira linha) .
Você pode evitar gerar esse erro específico lendo todos os dados zcat
produzidos. Você pode fazer isso por qualquer um
ls files/* | xargs -I {} zcat {} | { head -n 1; cat >/dev/null; }
ou
ls files/* | xargs -I {} zcat {} | sed -n 1p
ou
ls files/* | xargs -I {} zcat {} | awk 'NR == 1'
Ou vejaA resposta de Eduardo Trapanipara saber como simplesmenteignoraro erro.
Outra maneira de fazer isso é descompactar apenas o primeiro arquivo:
set -- files/*
zcat "$1" | head -n 1
Isso não aciona o PIPE
sinal, zcat
pois ele é executado apenas uma vez e não para cada arquivo no diretório. Isto teria o benefício adicional de lidar com qualquer nome de arquivo válido (por exemplo, nomes com novas linhas incorporadas).
Responder2
Mesmo que você veja a mensagem como a primeira linha, ela não está sendo gravada na saída padrão, mas no erro padrão.
Então, isso deve funcionar:
ls files/* | xargs -I {} zcat {} 2>/dev/null | head -n 1
Ele descarta a saída de erro padrão (envia-a para /dev/null)