Einfache Antwort

Einfache Antwort

Ich habe Probleme mit xargsund pipeBefehlen. 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 pipeBefehl die Ausgabe des linken Befehls als Eingabe an den rechten überträgt, während | xargsder 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' | mkdirWarum 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' | mkdirerwarten Sie, mkdirdie Standardeingabe zu lesen. mkdirDies 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 mkdirWie 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 aals stdin.

mkdirbehandelt diese Dinge sehr unterschiedlich, daher das Ergebnis, das Sie sehen.

verwandte Informationen