xargs e zcat: erros de silêncio

xargs e zcat: erros de silêncio

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 13instruçã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 zcatenvio de um PIPEsinal 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 headdepois de headter 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 zcatproduzidos. 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 PIPEsinal, zcatpois 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)

informação relacionada