xargs und zcat: Fehler stumm schalten

xargs und zcat: Fehler stumm schalten

Angenommen, ich habe:

** 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

jetzt funktioniert alles einwandfrei. Allerdings xargs -I {} zcat {}führt der Befehl zu folgendem Fehler:

xargs: zcat: terminated by signal 13

Das ist etwas, was ich für die Zwecke dessen, was ich versuche, ignorieren kann. Wenn ich den Code jedoch ausführe und ihn in eine leite less, ist die xargs: zcat: terminated by signal 13Anweisung die erste Zeile. Das ist nicht wünschenswert. Gibt es eine Möglichkeit, diese Warnung/diesen Fehler, der kein Fehler ist, zu unterdrücken oder abzufangen?

Antwort1

Der Fehler ist darauf zurückzuführen, dass zcatein PIPESignal an ihn gesendet wurde. Dies geschieht, weil er beim zweiten Mal zcat(und bei allen weiteren Malen danach, einmal für jede Datei außer der ersten) versucht, über die Pipe zu schreiben, headnachdem header beendet wurde (weil er mit seiner Aufgabe, die erste Zeile auszugeben, fertig ist).

Sie können diesen Fehler vermeiden, indem Sie alle Daten lesen, die zcatdabei entstehen. Dies können Sie tun, indem Sie entweder

ls files/* | xargs -I {} zcat {} | { head -n 1; cat >/dev/null; }

oder

ls files/* | xargs -I {} zcat {} | sed -n 1p

oder

ls files/* | xargs -I {} zcat {} | awk 'NR == 1'

Oder sieheEduardo Trápanis Antwortwie man einfachignorierender Fehler.

Eine andere Möglichkeit besteht darin, nur die erste Datei zu entpacken:

set -- files/*
zcat "$1" | head -n 1

Dies löst das PIPESignal nicht aus zcat, da es nur einmal und nicht für jede einzelne Datei im Verzeichnis ausgeführt wird. Dies hätte den zusätzlichen Vorteil, dass es mit jedem gültigen Dateinamen (z. B. Namen mit eingebetteten Zeilenumbrüchen) zurechtkäme.

Antwort2

Obwohl Sie die Nachricht als erste Zeile sehen, wird sie nicht in die Standardausgabe, sondern in den Standardfehler geschrieben.

Das hier sollte also funktionieren:

ls files/* | xargs -I {} zcat {} 2>/dev/null | head -n 1

Es verwirft die Standardfehlerausgabe (sendet sie an /dev/null)

verwandte Informationen