set
gibt die Variablen aus, leider werden auch die definierten Funktionen ausgegeben.
Glücklicherweise gibt der POSIX-Modus nur die Variablen aus:
( set -o posix ; set ) | less
In den Rohrleitungen less
oder Umleitung zu dem Sie die Optionen mögen.
Um die Variablen nur im Skript zu deklarieren:
( set -o posix ; set ) >/tmp/variables.before
source script
( set -o posix ; set ) >/tmp/variables.after
diff /tmp/variables.before /tmp/variables.after
rm /tmp/variables.before /tmp/variables.after
(Oder zumindest etwas basierend darauf :-))
-o posix
jetzt ein Diff enthält nur die Variablen.VARS="`set -o posix ; set`"; source script; SCRIPT_VARS="`grep -vFe "$VARS" <<<"$(set -o posix ; set)" | grep -v ^VARS=`"; unset VARS;
. Dadurch werden die Variablen auch in einem speicherfertigen Format ausgegeben. Die Liste enthält die Variablen, die das Skript geändert hat (es hängt davon ab, ob dies wünschenswert ist)source
, sollten Sie dies mit der Ausgabe von tun könnendeclare -p
.before=$(set -o posix; set); dosomestuff; diff <(echo "$before") <(set -o posix; set)
Es werden alle Variablen einschließlich der lokalen aufgelistet. Ich habe es aus der Liste der Variablen abrufen gelernt , deren Name einem bestimmten Muster entspricht , und es in meinem Skript verwendet .
quelle
compgen -v
Listet leider auch globale Variablen auf, die lokal nicht festgelegt wurden. Ich bin mir nicht sicher, ob dies ein langjähriger Fehler oder das gewünschte Verhalten ist.Dies muss alle Namen der Shell-Variablen drucken. Sie können eine Liste vor und nach dem Sourcing Ihrer Datei erhalten, genau wie mit "set", um zu unterscheiden, welche Variablen neu sind (wie in den anderen Antworten erläutert). Beachten Sie jedoch, dass eine solche Filterung mit diff einige Variablen herausfiltern kann, die Sie benötigen, die jedoch vor der Beschaffung Ihrer Datei vorhanden waren.
Wenn Sie in Ihrem Fall wissen, dass die Namen Ihrer Variablen mit "VARIABLE" beginnen, können Sie Ihr Skript als Quelle verwenden und Folgendes tun:
UPDATE: Für reine BASH-Lösung (keine externen Befehle verwendet):
quelle
eval "printf '%q\n' $(printf ' "${!%s@}"' _ {a..z} {A..Z})"
Basierend auf einigen der oben genannten Antworten hat dies für mich funktioniert:
Quelldatei :
quelle
Wenn Sie nachbearbeiten können (wie bereits erwähnt), können Sie einfach
set
am Anfang und am Ende Ihres Skripts einen Aufruf tätigen (jeweils eine andere Datei) und die beiden Dateien unterscheiden. Beachten Sie, dass dies immer noch etwas Rauschen enthält.Sie können dies auch programmgesteuert tun. Um die Ausgabe nur auf Ihren aktuellen Bereich zu beschränken, müssten Sie einen Wrapper für die Variablenerstellung implementieren. Beispielsweise
Welche ergibt
quelle
Hier ist etwas Ähnliches wie die @ GinkgoFr-Antwort, jedoch ohne die von @Tino oder @DejayClayton identifizierten Probleme, und es ist robuster als das clevere
set -o posix
Bit von @ DouglasLeeder :Der Unterschied besteht darin, dass diese Lösung nach dem ersten nicht variablen Bericht, z. B. der ersten von
set
Übrigens: Das "Tino" -Problem ist gelöst. Obwohl POSIX deaktiviert ist und Funktionen von gemeldet werden
set
,sed ...
erlaubt der Teil der Lösung nur variable Berichte durch (zVAR=VALUE
. B. Zeilen). InsbesondereA2
schafft es das nicht fälschlicherweise in die Ausgabe.UND: Die „DejayClayton“ Problem ist gelöst (eingebettete Zeilenumbrüche in Variablenwerte haben nicht stören die Ausgabe - jeweils
VAR=VALUE
eine einzelne Ausgangsleitung erhalten):HINWEIS: Die von @DouglasLeeder bereitgestellte Lösung leidet unter dem Problem "DejayClayton" (Werte mit eingebetteten Zeilenumbrüchen). Unten ist das
A1
falsch undA2
sollte überhaupt nicht angezeigt werden.ENDLICH: Ich denke nicht, dass die Version der
bash
Dinge, aber es könnte. Ich habe meine Tests / Entwicklungen an diesem durchgeführt:POST-SCRIPT: Angesichts einiger anderer Antworten auf das OP bin ich <100% sicher, dass
set
immer Zeilenumbrüche innerhalb des Werts konvertiert werden\n
, auf den sich diese Lösung stützt, um das Problem "DejayClayton" zu vermeiden. Vielleicht ist das ein modernes Verhalten? Oder eine Variation zur Kompilierungszeit? Oder eineset -o
odershopt
Option? Wenn Sie solche Variationen kennen, fügen Sie bitte einen Kommentar hinzu ...quelle
Versuchen Sie es mit einem Skript (nennen wir es "ls_vars"):
chmod + x it und:
quelle
Aus Sicht der Sicherheit entweder @ akostadinov die Antwort oder @ JuvenXu die Antwort auf Berufung auf die unstrukturierte Ausgang des vorzuziehen ist
set
Befehl, aufgrund der folgenden potenziellen Sicherheitslücke:Mit der obigen Funktion
doLogic
wirdset
überprüftPS1
, ob eine Variable vorhanden ist, um festzustellen, ob das Skript interaktiv ist oder nicht (egal, ob dies der beste Weg ist, um dieses Ziel zu erreichen; dies ist nur ein Beispiel).Die Ausgabe von
set
ist jedoch unstrukturiert, was bedeutet, dass jede Variable, die eine neue Zeile enthält, die Ergebnisse vollständig verunreinigen kann.Dies ist natürlich ein potenzielles Sicherheitsrisiko. Verwenden Sie stattdessen entweder die Unterstützung von Bash für die Erweiterung indirekter Variablennamen oder
compgen -v
.quelle
Versuchen Sie Folgendes:
set | egrep "^\w+="
(mit oder ohne| less
Rohrleitung)Die erste vorgeschlagene Lösung
( set -o posix ; set ) | less
funktioniert, hat jedoch einen Nachteil: Sie überträgt Steuercodes an das Terminal, sodass sie nicht richtig angezeigt werden. Wenn es zum Beispiel (wahrscheinlich) eineIFS=$' \t\n'
Variable gibt, können wir sehen:…stattdessen.
Meine
egrep
Lösung zeigt dies (und eventuell andere ähnliche) richtig an.quelle
bash -c $'a() { echo "\nA=B"; }; unset A; set | egrep "^\w+="' | grep ^A
Anzeigen handeltA=B"
-> Fail!Ich habe die Antwort wahrscheinlich schon vor einiger Zeit gestohlen ... sowieso etwas anders als eine Funktion:
quelle
Der
printenv
Befehl:printenv
druckt alleenvironment variables
zusammen mit ihren Werten.Viel Glück...
quelle
Eine einfache Möglichkeit, dies zu tun, besteht darin, den Bash-Strict-Modus zu verwenden, indem Sie Systemumgebungsvariablen festlegen, bevor Sie Ihr Skript ausführen, und diff verwenden, um nur diejenigen Ihres Skripts zu sortieren:
Sie können jetzt Variablen Ihres Skripts in /tmp/script_vars.log abrufen. Oder zumindest etwas basierend darauf!
quelle