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 13
Anweisung 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 zcat
ein PIPE
Signal 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, head
nachdem head
er 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 zcat
dabei 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 PIPE
Signal 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)