Wie kann ich auf eine posix-kompatible Weise, die mit mehreren Implementierungen funktioniert, die Liste der aktuell definierten Umgebungsvariablen ohne deren Werte drucken ?
Bei einigen Implementierungen (mksh, freebsd / bin / sh) ist die alleinige Verwendung genau das Richtige für Sie export
:
$ export
FOO2
FOO
Bei einigen anderen Implementierungen (bash, zsh, dash) wird jedoch export
auch der Wert angezeigt. Mit Bash zum Beispiel:
$ export
export FOO2='as df\
asdk=fja:\
asd=fa\
asdf'
export FOO='sjfkasjfd kjasdf:\
asdkj=fkajdsf:\
:askjfkajsf=asdfkj:\
safdkj'
$ printenv | sed -n l
FOO2=as\tdf\$
asdk=fja:\$
asd=fa\$
asdf$
FOO=sjfkasjfd kjasdf:\$
asdkj=fkajdsf:\$
\t:askjfkajsf=asdfkj:\$
safdkj$
Andere Optionen wie env
oder printenv
haben keine Optionen, um nur die Variablennamen ohne Werte zu drucken, zumindest nicht auf den Linux- und Freebsd-Plattformen, die ich ausprobiert habe.
Rohrleitungen zu awk / sed / etc. Das Trimmen der Liste mit Parametererweiterungstechniken (z. B. ${foo%%=*}
) ist akzeptabel, muss jedoch mit Werten arbeiten, die sich über Linien erstrecken können =
und Leerzeichen im Wert enthalten (siehe Beispiel oben).
Spezifische Antworten für bestimmte Shell-Implementierungen sind interessant, aber ich suche hauptsächlich nach etwas, das für alle Implementierungen kompatibel ist.
export -p
von POSIX angegebene Ausgabe, um eine Ausgabe zu generieren, die auch für die Eingabe in die Shell geeignet ist.export -p
?export -p
da Sie dadurch eine konsistente Ausgabe über alle POSIX-Shells erhalten, von denen Sie sagten, dass Sie sie wollten.export -p
passt nicht zur ersten Anforderung - nur Variablennamen ohne Werte drucken.export -p
. Ich werde diese Analyse nicht schreiben, da sie im allgemeinen Fall auch eine ordnungsgemäße Anführungszeichenanalyse durchführen müsste, falls Sie eine Variable haben, deren Wert so etwas wie isthello\nexport var=value
. Einer der wenigen anderen Befehle, mit denen Sie in allen POSIX-Shells eine konsistente Ausgabe erhalten, istenv
, aber diese Ausgabe ist schwieriger zu analysieren, da dasexport =
Bit fehlt .Antworten:
In awk ist es ziemlich einfach.
Beachten Sie jedoch, dass einige awk-Implementierungen eigene Umgebungsvariablen hinzufügen (z. B. GNU awk fügt hinzu
AWKPATH
undAWKLIBPATH
zuENVIRON
).Die Ausgabe ist nicht eindeutig, wenn der Name einer Umgebungsvariablen einen Zeilenumbruch enthält, was äußerst ungewöhnlich, aber technisch möglich ist. Eine reine sh-Lösung wäre schwierig. Ihre beste Wette ist, mit zu beginnen,
export -p
aber es ist schwierig, es in reinem sh zu massieren. Sie können sed verwenden, um die Ausgabe von zu massierenexport -p
, und dann verwendeneval
, um die Schale dazu zu bringen, das zu entfernen, was sie zitiert. Bash und zsh drucken nicht standardmäßige Präfixe.Beachten Sie, dass je nach Shell
export -p
möglicherweise Variablen angezeigt werden, deren Name in der Shell nicht gültig ist, und wenn dies nicht der Fall ist, werden die Namen möglicherweise richtig zitiert oder nicht. Beispielsweise lassen dash, mksh und zsh Variablen weg, deren Name eine neue Zeile enthält, BusyBox dash und ksh93 drucken sie roh und bash druckt sie roh ohne ihren Wert. Wenn Sie sich gegen nicht vertrauenswürdige Eingaben verteidigen müssen, verlassen Sie sich nicht auf eine reine POSIX-Lösung und rufen Sieeval
auf keinen Fall etwas auf, das aus der Ausgabe von abgeleitet istexport -p
.quelle
exit
notwendig ist).FOO<newline>BAR
, die Sie nicht wissen , ob es eine ist dieFOO<newline>BAR
Umgebungsvariable (dieexport -p
mit den meisten Schalen nicht zeigen würde, sehenenv $'FOO\nBAR=test' awk 'BEGIN{for (v in ENVIRON) print v}'
) oder sowohl einFOO
undBAR
Umgebungsvariablen.awk
eigene Umgebungsvariablen (AWKPATH
undAWKLIBPATH
auf meinem System)Ich mag einfache Dinge; Dies funktioniert für POSIX-Systeme:
quelle
export AAA=$'multi\nBBB=line'
compgen -e
. Es hilft nicht für meine tragbaren Skripte (z. B. wenn Bash nicht verfügbar ist), aber es ist interessant.dash
in Debian erhalte ich die gleichen Ergebnisse mit dem obigen Befehl oder dem, der geändert wurdeprintenv | sed 's;*=.;;' | sort
, um die Werte zu erhalten. Ich habe die Variable exportiertyo
und ihr Ihren ersten Kommentar oben zugewiesen. Es wurde wie erwartet mit mehreren Zeilen gedruckt. Ich bin mir nicht sicher, was Sie erleben, aber es sollte keine abgeschnittene Ausgabe geben. Führen Sie den Befehl in der Shell aus. Was auch immer es dort ausgibt, es sollte funktionieren. Erwarten Sie kein Abschneiden. Dann im Kontext von TERMCAP / screen / iirc; sollte gleich sein. Wenn die Ausgabe nicht übereinstimmt, liegt wahrscheinlich ein Problem mit einem dieser Programme vor.