Ich habe Probleme mit xargs
und pipe
Befehlen. Hier ist ein Beispiel =
echo 'a' | xargs mkdir
Dieser Befehl erstellt ein Verzeichnis mit dem Namen a
. Daher kann ich verstehen, dass dieser Befehl gleichbedeutend ist mitmkdir a
Aber warum funktioniert dieser Befehl nicht = echo 'a' | mkdir
?
Ich habe gelesen, dass der pipe
Befehl die Ausgabe des linken Befehls als Eingabe an den rechten überträgt, während | xargs
der Befehl die Ausgabe des linken Befehls als Argument an den rechten überträgt.
1-Was sind die Unterschiede zwischen Eingabe und Argument?
2. echo 'a' | mkdir
Warum funktioniert dieser Befehl nicht und was entspricht diesem Befehl?
Danke schön...
Antwort1
Einfache Antwort
Die Argumente sind eine Eingabe.
Längere Antwort
Es gibt auch andere Eingabearten.
In Ihrem Beispiel echo 'a' | mkdir
erwarten Sie, mkdir
die Standardeingabe zu lesen. mkdir
Dies ist jedoch nicht vorgesehen.
Was Sie als Eingabe aufrufen, ist Standardeingabe ( stdin
). Und Ausgabe ist Standardausgabe ( stdout
). Es gibt alles Standardfehler ( stderr
). Und einen Exit-Code.
Noch längere Antwort: Was ist also der Unterschied?
Die Argumente müssen vor dem Start des Programms verfügbar sein. Normalerweise ist es: kurz; enthält Optionen, Dateinamen und kurzen Text.
In den Standard-Eingang kann während der Programmausführung geschrieben werden; es können Daten gesendet werden, die beim Programmstart noch nicht vorhanden waren; es ist nicht garantiert, dass man ihn in anderer Reihenfolge lesen kann (lesen Sie ihn also sequenziell); er kann eine beliebige Länge haben; es gibt nur einen Standard-Eingang pro Prozess, wenn Sie mehrere benötigen, senden Sie Dateinamen als Argumente;
echo 'a' | xargs mkdir
Wie kann man ohne auskommen?xargs
mkdir "$(echo 'a')"
Das $()
bedeutet, dass der enthaltene Befehl ausgeführt wird und dann $()
und sein Inhalt durch die Standardausgabe dieses Befehls ersetzt werden.
Antwort2
Auch ich war darüber sehr lange verwirrt. Ich nehme ein vielleicht etwas einfacheres Beispiel (ich bin bei weitem kein Bash-Experte):
wc "test"
wc <<< "test" (same as: echo "test" | wc)
Die Ergebnisse dieser beiden sind sehr unterschiedlich. Der erste versucht, eine Datei zu lesen test
, der zweite zeigt an 1 1 5
.
Das Problem hierbei ist, dass wc "test"
dieStreit "test"
als Eingabe, während wc <<< "test"
dauertstdin.
Wenn Sie also ausgeben echo 'a' | xargs mkdir
(xargs steht für: als Argument ausführen), übergeben Sie einStreitzu mkdir
; es ist wie Folgendes zu tun: mkdir a
.
Wenn Sie hingegen ein Problem haben echo 'a' | mkdir
(einfacher wäre : mkdir <<< 'a'
), übergeben Sie es a
als stdin.
mkdir
behandelt diese Dinge sehr unterschiedlich, daher das Ergebnis, das Sie sehen.