Supongamos que tengo:
** 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
ahora todo funciona correctamente. Sin embargo, el xargs -I {} zcat {}
comando produce el siguiente error:
xargs: zcat: terminated by signal 13
Lo cual es algo que puedo ignorar a los efectos de lo que estoy tratando de hacer. Sin embargo, si ejecuto el código y lo canalizo a less
, la xargs: zcat: terminated by signal 13
declaración es la primera línea. Esto no es deseable. ¿Hay alguna manera de suprimir o detectar esta advertencia/error que no es un error?
Respuesta1
El error se debe a que se le envió zcat
una señal. PIPE
Esto sucede porque la segunda vez zcat
que se ejecuta (y todas las demás veces posteriores, una vez para cada archivo excepto la primera), intenta escribir a través de la tubería head
después de head
haber salido (debido a que ha terminado con su tarea de generar la primera línea). .
Podrías evitar generar este error en particular leyendo todos los datos que zcat
produce. Puedes hacer esto ya sea
ls files/* | xargs -I {} zcat {} | { head -n 1; cat >/dev/null; }
o
ls files/* | xargs -I {} zcat {} | sed -n 1p
o
ls files/* | xargs -I {} zcat {} | awk 'NR == 1'
o verLa respuesta de Eduardo Trapanipara saber cómo simplementeignorarel error.
Otra forma de hacer esto es descomprimir sólo el primer archivo:
set -- files/*
zcat "$1" | head -n 1
Esto no activa la PIPE
señal porque zcat
solo se ejecuta una vez y no para cada archivo del directorio. Esto tendría el beneficio adicional de poder manejar cualquier nombre de archivo válido (por ejemplo, nombres con nuevas líneas incrustadas).
Respuesta2
Aunque vea el mensaje como la primera línea, no se escribe en la salida estándar, sino en el error estándar.
Entonces, esto debería funcionar:
ls files/* | xargs -I {} zcat {} 2>/dev/null | head -n 1
Descarta la salida de error estándar (la envía a /dev/null)