Was ist ein * .sortierter Befehl und warum funktioniert er in meiner Bash nicht?

7

In einem Bash-Handbuch für Anfänger (Abschnitt 3.2.1.2. Lokale Variablen ) gibt es einen Beispielbefehl, der alle lokalen Variablen auflisten soll, die sich nicht in Umgebungsvariablen befinden, oder so denke ich:

diff set.sorted printenv.sorted | grep "<" | awk '{ print $2 }'

Ich glaube, ich verstehe alles über diesen Befehl außer dem *.sortedTeil. Außerdem funktioniert dieser Befehl auf meinem Bash nicht, insbesondere aufgrund der oben genannten Elemente. Hier ist die Antwort (es ist die polnische Version von Keine solche Datei oder Verzeichnis ):

diff: set.sorted: Nie ma takiego pliku ani katalogu
diff: printenv.sorted: Nie ma takiego pliku ani katalogu

Bemerkenswert ist, dass ich Ubuntu 14.04 verwende, ohne dass Änderungen an der Standardinstallation vorgenommen wurden.

Aus diesem Grund konnte ich diesen Befehl in meiner Bash-Shell nicht analysieren und bei Google auch nichts darüber finden, außer dem Tutorial, aus dem ich diesen Befehl übernommen habe.

Ich werde für eine umfassende Erklärung dankbar sein, da ich noch nie zuvor auf einen solchen Ausdruck gestoßen bin.

Lurco
quelle
10
Zum späteren Nachschlagen können Sie einen Befehl ausführen LANG=C command, um eine Ausgabe in Englisch für die Veröffentlichung auf Websites wie dieser zu erhalten. Zum Beispiel : LANG=C diff set.sorted printenv.sorted .
Terdon

Antworten:

21

Sie sind keine Ausdrücke, sondern Dateinamen für Dateien, die wie folgt erstellt wurden:

 printenv | sort > printenv.sorted
 set | sort > set.sorted

Das geht aus der Dokumentation nicht hervor, so dass Ihre Verwirrung verständlich ist!

Beachten Sie, dass Sie möglicherweise helfen müssen diffund sie grepzwingen müssen, ihre Eingaben als Text (mit -a) zu behandeln . Umgebungsvariablen können Werte enthalten, die dazu führen, dass sie ihre Eingabe als binär behandeln, was nichts Nützliches ergibt:

diff -a set.sorted printenv.sorted | grep -a "<" | awk '{ print $2 }'

Besser noch, verwenden Sie comm, um die beiden Dateien zu vergleichen:

comm -23 set.sorted printenv.sorted

Sie können die Dateien durch Prozessersetzungen ersetzen:

comm -23 <(set|sort) <(printenv|sort)

um das Erstellen von Dateien zu vermeiden.

Stephen Kitt
quelle
1
Wie hast du das bekommen? Ich sehe diese Befehle überhaupt nicht in der Anleitung!
Dmitry Grigoryev
1
Durch Interpretation des einleitenden Satzes "Unten ist eine Diff-Datei, die durch Vergleichen von printenv und set output erstellt wurde"; Da der Befehl nicht ausgeführt wird printenvoder set, habe ich vermutet, dass die angegebenen Dateien diffdie Ausgabe sind, die sortiert werden muss, damit der Vergleich aussagekräftig ist.
Stephen Kitt
5
Für einen erfahrenen * nix-Benutzer ist die Schlussfolgerung von @StephenKitt offensichtlich. Für das angegebene Publikum eines "für Anfänger" -Ratgebers könnte er genauso gut ein Hellseher sein, der in eine Kristallkugel blickt. Der Autor des Handbuchs sollte die beiden Befehle explizit buchstabieren, wie Stephen es hier getan hat, damit die Anfänger die Punkte verbinden können.
Monty Harder