Das Kommando bla -abc erzeuge eine Liste von Dateinamen. Die so bestimmten
Dateien wollen Sie mit dem Kommando blubb verarbeiten, aber der
Kommandoaufruf
blubb `bla -abc`
schlägt mit einer Fehlermeldung fehl -- die resultierende Kommandozeile ist zu lang. Mit welchem Kommando können Sie dieses Problem lösen? (Geben Sie nur den Kommandonamen an, ohne Pfad und ohne Optionen.)
Textfrage
LPI-Lernziel Ströme, Pipes und Umleitungen verwenden (103.4)
Das Kommando xargs ist eine nützliche Möglichkeit, Parameter von der
Standardausgabe eines Kommandos auf die Kommandozeile eines anderen zu
schaffen, ohne wegen der Länge der Kommandozeile Probleme zu bekommen.
In der Tat darf die Kommandozeile bei gängigen Unix-artigen Systeme wie
Linux heutzutage eine beträchtliche Länge aufweisen -- wenn Sie einen
Wert für Ihr System herausfinden wollen, sagen Sie spaßeshalber
mal getconf ARG_MAX in der Shell. Bei uns liefert das 2097152, und das ist
nur ein garantiertes Minimum; das System darf durchaus mehr erlauben.
Trotzdem ist das manchmal nicht genug.
xargs liest seine Standardeingabe und teilt sie (im einfachsten
Fall) an Leerzeichen und Zeilentrennern in »Wörter« ein. Diese Wörter
werden dann dem Kommando, das hinter xargs angegeben wurde, als
»Kommandoparameter« übergeben, wobei xargs darauf achtet, dass die
maximale Länge der Kommandozeile nicht überschritten wird. Ist seine
Standardeingabe länger als das, was dem gewünschten Kommando auf einen
Sitz übergeben werden kann, wird das Kommando gegebenenfalls mehrmals
aufgerufen. Ein typisches Beispiel könnte ungefähr so aussehen:
$ find . -name "*.bak" | xargs rm
Das find-Kommando liefert hier eine (potentiell lange) Liste von
Dateinamen, die von xargs ans rm-Kommando übergeben werden. Der
Vorteil dieses Ansatzes gegenüber
$ find . -name "*.bak" -exec rm {} \;
ist, dass nicht für jeden Dateinamen, den find findet, ein rm-Prozess
angestoßen wird, sondern jeder rm-Prozess die maximale Anzahl von
Dateien übergeben bekommt.
Nicht angemeldet