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
?
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 ist hello\nexport var=value
. Einer der wenigen anderen Befehle, mit denen Sie in allen POSIX-Shells eine konsistente Ausgabe erhalten, ist env
, aber diese Ausgabe ist schwieriger zu analysieren, da das export =
Bit fehlt .
export -p
von POSIX angegebene Ausgabe, um eine Ausgabe zu generieren, die auch für die Eingabe in die Shell geeignet ist.