Hier ist so mething ähnlich der @GinkgoFr Antwort, aber ohne die von @Tino oder @DejayClayton identifizierten Probleme, und ist robuster als @ DouglasLeeder cleveren set -o posix
Bit:
+ function SOLUTION() { (set +o posix; set) | sed -ne '/^\w\+=/!q; p;'; }
Der Unterschied besteht darin, dass diese Lösung nach dem ersten nicht STOPPT -Variablenbericht, z die erste von set
gemeldet Funktion BTW: Das "Tino" -Problem ist gelöst. Obwohl POSIX ausgeschaltet ist und Funktionen von set
, gemeldet werden, erlaubt der Teil der Lösung nur variable Berichte (z. B. VAR=VALUE
Zeilen). Insbesondere die A2
tut nicht fälschlicherweise machen es in den Ausgang.
+ function a() { echo $'\nA2=B'; }; A0=000; A9=999;
+ SOLUTION | grep '^A[0-9]='
A0=000
A9=999
UND: Die "DejayClayton" Problem gelöst ist (eingebettete Zeilenumbrüche in Variablenwerte tun nicht die Ausgabe stören - jeder VAR=VALUE
eine einzige Ausgangsleitung erhalten):
+ A1=$'111\nA2=222'; A0=000; A9=999;
+ SOLUTION | grep '^A[0-9]='
A0=000
A1=$'111\nA2=222'
A9=999
HINWEIS: Die Lösung von @DouglasLeeder bereitgestellt, leidet unter dem "DejayClayton" -Problem (Werte mit eingebetteten Zeilenumbrüchen). Unten ist die A1
falsch und A2
sollte überhaupt nicht angezeigt werden.
$ A1=$'111\nA2=222'; A0=000; A9=999; (set -o posix; set) | grep '^A[0-9]='
A0=000
A1='111
A2=222'
A9=999
ENDLICH: Ich glaube nicht, die Version von bash
Angelegenheiten, aber es könnte. Ich habe meine Prüfung/Entwicklung auf dieses ein:
$ bash --version
GNU bash, version 4.4.12(1)-release (x86_64-pc-msys)
POST-SCRIPT: einige der anderen Antworten auf die OP gegeben, ich bin < 100% sicher, dass links set
immer wandeln Zeilenumbrüche im Wert \n
, auf die diese Lösung angewiesen ist, um das "DejayClayton" -Problem zu vermeiden. Vielleicht ist das ein modernes Verhalten? Oder eine Kompilierzeitvariation? Oder eine set -o
oder shopt
Optionseinstellung? Wenn Sie über solche Variationen wissen, fügen Sie bitte einen Kommentar ...
Sie bearbeitet, während ich posten. Netter Aufruf mit dem '-o posix' jetzt wird ein Diff nur die Variablen enthalten. – ezpz
Ohne temporäre Dateien zu verwenden: 'VARS =" \ 'set -o posix; set \" "; Quellskript; SCRIPT_VARS = "\' grep -vFe "$ VARS" <<< "$ (setze -o posix; setze)" | grep -v^VARS = \ ""; unset VARS; '. Dies wird auch die vars in einem ready-to-save-Format ausgeben. Die Liste enthält die Variablen, die das Skript geändert hat (es hängt davon ab, ob dies wünschenswert ist) –
Leider gibt der Posix-Modus auch Vars aus, die nicht gesetzt werden können, so dass Sie die Ausgabe nicht "auslesen" und alle wieder einlesen können. –