Ob ein Programm seine Eingabe von stdin
oder als Befehlszeilenargumente erhält, ist Sache des Designers. Beide Ansätze haben ihre Vorzüge. Bei Programmen, die ausschließlich mit Dateien arbeiten, ist es jedoch normalerweise bequemer, die Dateinamen als Befehlszeilenargumente zu übergeben, als durch stdin
.
Der offensichtlichste Grund ist, dass der übliche Fall, nur ein Programm in einer Datei auszuführen, einfacher einzugeben ist: readlink file
statt echo file | readlink
.
Ein subtileres Problem ist die Korrektheit. Das Problem ist, dass stdin
das Programm beim Durchlaufen von Dateinamen in der Lage sein muss, einen Dateinamen von einem anderen zu unterscheiden. Dies geschieht häufig unter der Annahme, dass die Dateinamen durch Leerzeichen oder Zeilenumbrüche getrennt sind. Dies ist jedoch falsch, da Dateinamen Leerzeichen enthalten können. Eine bessere Möglichkeit besteht darin, die Dateinamen durch Null-Bytes zu trennen. Es kann jedoch unpraktisch sein, eine Liste von durch Nullen getrennten Dateien zu erstellen.
Durch das Übergeben von Dateinamen in der Befehlszeile wird dieses Problem vermieden, da die Shell das gesamte Parsen und Zitieren für das Programm übernimmt. Sie können dies eingeben touch $'foo\nbar'
und touch
sehen dies korrekt als einen Dateinamen, der eine neue Zeile enthält, ohne dass Sie selbst spezielle Analysen durchführen oder Anführungszeichen setzen müssen.
Wenn Sie jedoch Dateien stdin
für ein bestimmtes Programm weitergeben möchten, können Sie dies tun. Dafür ist da xargs
. xargs
Mit dieser Option können Sie ein Programm verwenden, das nur Argumente in der Befehlszeile akzeptiert, und stattdessen die Argumente durchgehen lassen stdin
.
Mit anderen Worten, damit können Sie Folgendes tun : which my_script | xargs readlink
.
Wenn Sie immer so readlink
arbeiten möchten, können Sie einen Alias erstellen : alias readlink="xargs readlink"
. Auf diese Weise können Sie which my_script | readlink
wie ursprünglich gewünscht tippen .
xargs
(habe mich nie darum gekümmert, Google darüber zu informieren oder die Manpage zu lesen), aber das macht Sinn. Das einzige Mal, dass ich xargs verwendet habe, ist das Öffnen einer Liste von Dateien in vim, a lafind *.rb | xargs vim
. Jetzt verstehe ich, was das tut und warum das funktioniert, wennfind *.rb | vim
es nicht funktioniert. Vielen Dank!Für Befehle, die keine Argumente über STDIN annehmen, können Sie stattdessen dieses Code-Pragma verwenden:
Beispiel
Überprüfen Sie nun, ob es auf der
$PATH
.Oder der bevorzugte Weg, indem Sie
type
Folgendes verwendenwhich
:Oder nur der Wert:
Jetzt rennen wir
readlink
:quelle
type
das besserwhich
?