Ich wollte env
alle Umgebungsvariablen anzeigen. Ich habe zufällig den Befehl eingegeben set
und es scheint, als würde ein Skript per „cat“ an die Konsole gesendet. Warum passiert das?
DasReferenzseitescheint es nicht zu erklären.
If no options or arguments are supplied, set displays the names
and values of all shell variables
Antwort1
set
ist ein in die Shell integrierter Befehl. Wenn Sie ihn in der Befehlszeile eingeben, sehen Sie alles in Ihrer aktuellen Umgebung. Dazu gehören auch alle Funktionen, die Sie geladen haben. Beachten Sie, dass die meisten Distributionen zumindest einige hilfreiche Funktionen in den Shell-Profilen enthalten, und wenn Sie die Bash-Vervollständigung installiert haben, werden Sie Unmengen davon haben.
env
ist eine Binärdatei. Sie wird wie jeder andere Befehl von der Shell geladen und ausgeführt. Daher sieht sie nur die Umgebungsvariablen, die Sie exportiert haben, was alle Funktionen aus Ihrer Shell-Umgebung ausschließen sollte.
Antwort2
Wie Frank Schrijver in seinem Kommentar erklärt, set
wird das eingebaute Bash-Programm alle Shell-Variablen (Variablen, die nur in dieser Laufzeitumgebung "existieren") und alleShell-Funktionen auch, wieder Funktionen, die in diesem bestimmten Shell-Prozess initialisiert und vorhanden sind.
So werden Sie beispielsweise Funktionen wie sehen
_tilde ()
{
...
}
Dies ist eine Funktion, deren Zweck darin besteht, die Tabulatorvervollständigung für das ~
Zeichen für Ihren Bash-Zeileneditor bereitzustellen.
Tatsächlich ist sogar die Bash-Dokumentation für set
einsehbar, indem Sie den Befehl ausführen
man bash | less '+/^\s*set \[--'
erwähnt nicht die Tatsache, dass es standardmäßig alle Shell-Funktionen druckt, aber wie Sie festgestellt haben und andere darauf hingewiesen haben, druckt es auch Shell-Funktionen.