Ich verstehe nicht ganz, wie Pipes in Bash funktionieren.
Ich weiß, dass es eine Ausgabe von einem Befehl als Eingabe in einem anderen Befehl nimmt.
Was für eine Ausgabe ich bekommen kann, weil es das ist, was der Befehl auf dem Bildschirm ausgibt.
Aber woher weiß ich, welche Eingabe ein Befehl benötigt?
Hier ist ein Beispiel, von dem ich dachte, dass es funktionieren würde:
which gem | rm
Leider nicht.
Welcher Edelstein druckt das /usr/bin/gem
so aus, muss die Ausgabe stimmen?
Ich dachte, das wurde mir gegeben, also wäre es so, rm /usr/bin/gem
aber ich habe mich geirrt.
Meine Frage ist also, woher weiß ich, welche Eingabe ein Befehl benötigt?
rm /usr/bin/gem
ist es eine schreckliche Idee. Lassen Sie dasgem
(und den Ruby-Interpreter, zu dem es gehört) in Ruhe und installieren Sie Ihren bevorzugten Ruby-Interpreter (undgem
) mitrvm
: rvm.beginrescueend.comAntworten:
"Eingabe" und "Befehlszeilenargumente" sind verschiedene Dinge.
rm
Entfernt die als Argumente angegebenen Dateien.Eine Pipe leitet die Ausgabe des linken Befehls an die Eingabe des rechten Befehls um. Dies hat keine Auswirkungen auf die Befehlszeilenargumente des Programms auf der rechten Seite.
Versuchen Sie dazu
xargs
, die Standardeingabe in Befehlszeilenargumente für die Ausführung eines Programms zu konvertieren. Das ist seine Aufgabe.which gem | xargs rm
Zum Beispiel wird dasgem
in Ihrem PFAD entfernt.quelle
rm
nimmt keine Eingabe, sondern Argumente. Diese sind unterschiedlich. Argumente sind die Schalter und Dateinamen usw., die Sie einem Programm in der Befehlszeile geben, um sein Verhalten zu beeinflussen. Eingabe sind die Daten, mit denen das Programm arbeitet. Nimmt zum Beispielgrep
sowohl Eingaben als auch Argumente an:Es gibt zwei Argumente
"foo"
undfile.txt
. Die Eingabe ist der Inhalt vonfile.txt
, nicht die Zeichenfolgefile.txt
selbst. Da grep Eingaben akzeptiert, können Sie es mit Pipes verwenden:erzeugt die gleiche Ausgabe, da cat
file.txt
als Argument nimmt und den Inhalt vonfile.txt
als Ausgabe erzeugt. Diese Ausgabe wird dann an grep weitergeleitet, was den gleichen Effekt ergibt, als hätte grep die Datei selbst geöffnet, wie im ersten Beispiel.Wenn Sie die Ausgabe eines Programms als Argument für ein anderes verwenden möchten, verwenden Sie Backticks:
oder diese alternative (bash-spezifische) Syntax:
Bearbeiten: oder
xargs
wie ein anderer Antwortender darauf hinweist. Viele Möglichkeiten, eine Katze mit einer Befehlszeile zu häuten.quelle
cat file.txt | grep "foo"
dies hunderte Male langsamer sein kann alsgrep "foo" file.txt
.grep --help
einen schnellen Überblick über die akzeptierten Argumente.Schauen Sie sich die
man
Seiten der Befehle an, an denen Sie interessiert sind. Diese Programme geben an, dass sie gelesen habenstdin
(versuchen Sie esman grep
mit einem beliebten Befehl, der stdin liest).quelle
man grep | grep 'standard input'
undIf no file arguments are specified, the standard input is used.
als letztes Match bekommen. 👍 Ich musstegrep
einen kleinen Vorgeschmack auf seine eigene Medizin geben. 😎Diese sind alle gefährlich, wenn Sie ein Verzeichnis in Ihrem PATH haben, das Leerzeichen enthält, oder wenn der Befehlsname Leerzeichen enthält:
GNU Parallel http: // www.gnu.org/software/parallel/ hat dieses Problem nicht, so dass dies auch dann funktioniert, wenn Sie ein Verzeichnis in Ihrem PATH haben, das Leerzeichen enthält, oder wenn der Befehlsname Leerzeichen enthält:
Sehen Sie sich das Einführungsvideo zu GNU Parallel an: http://www.youtube.com/watch?v=OpaiGYxkSuQ
quelle