Liste aller Umgebungsvariablen in busybox
Umgebungsvariablen mit multiline Werte verwirren können env
's-Ausgabe:
# export A="B
> C=D
> E=F"
# env
A=B
C=D
E=F
TERM=xterm
SHELL=/bin/bash
USER=root
MAIL=/var/mail/root
PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
PWD=/root
LANG=en_US.UTF-8
PS1=\h:\w\$
SHLVL=1
HOME=/root
LOGNAME=root
_=/usr/bin/env
In diesem Fall habe ich kann nicht verwenden Sie einfach awk -F=
extrahieren Sie alle Namen, weil es zeigt falsche Namen C
und E
:
# env | awk -F= '{print $1}'
A
C
E
TERM
SHELL
USER
MAIL
PATH
PWD
LANG
PS1
SHLVL
HOME
LOGNAME
_
Dann habe ich herausgefunden, dass env
unterstützt Flagge -0
zu Ende jeden Ausgang mit 0 byte anstatt "newline", also mit sed
ich könnte schneiden Sie die Werte in bash
:
# env -0 | sed -e ':a;N;$!ba;s/\([^=]\+\)=\([^\x00]*\)\x00/\1\n/g'
A
TERM
SHELL
USER
MAIL
PATH
PWD
LANG
PS1
SHLVL
HOME
LOGNAME
_
Aber die BusyBox-version von env
nicht unterstützt Flagge -0
. Gibt es einen anderen Weg, es zu tun?
- Sind Sie offen, um mit einer anderen scripting-Sprache, um die Arbeit zu tun, wie
python -c 'import os; print "".join(x + "\n" for x in os.environ),'
oderperl -le 'for (keys %ENV) { print $_ }'
oder brauchen Sie beschränken sich auf einen minimalen Satz von shell-tools? - Mit Python wäre es zu einfach 🙂 Hier kann ich verwenden BusyBox nur.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Wenn Sie mit linux (ich dachte, busybox lief nur auf linux, aber ich kann falsch sein),
/proc/self/environ
enthält eine NULL getrennt Umfeld, in der gleichen form wieenv -0
gibt Sie. Sie können ersetzenenv -0 |
mit< /proc/self/environ
./proc/self/environ
aber das Skript fürsed
dass Sie aus meinem Beispiel funktioniert nicht in der busybox-Implementierung der sed die gleiche Weise wie in regelmäßigen GNU sed. Der erste Teil des sed-Skriptssed -e ':a;N;$!ba'
sollte sammeln alle Linien in eine (hier zu sehen), aber in der busybox-es ersetzt auch alle\0
Zeichen mit\n
. Versuchen Sie, diesen Befehl in die bash und busybox:echo -ne "A\0B" | sed -e ':a;N;$!ba' | hexdump -C
.Dies ist vielleicht nicht elegante, aber funktionierende Lösung. Es extrahiert zunächst alle möglichen Namen von
env
's ausgegeben, dann prüft jeden von Ihnen mit der shell ist die expansion${parameter:+word}
. Und schließlich, entfernt Duplikate, da die gleichen Variablennamen gedruckt werden kann auf mehreren Linien inenv
's Ausgabe (als real-variable den Namen und als ein Teil von einigen anderen Variablen multiline-Wert):PS: Die
| sort | uniq
Teil auch umgesetztawk
.Dieser wird brechen, wenn Sie Ihre Umgebungsvariable Werte enthalten null-Werte. Aber das würde auch Pause von POSIX Kompatibilität.
So sollte es funktionieren.
...es sei denn, Sie erwarten zu begegnen Umgebungsvariable Namen, die Zeilenumbrüche enthalten. In diesem Fall werden die Zeilenumbrüche werden abgeschnitten, wenn Sie angezeigt wird. Aber ich kann nicht scheinen, um zu ergründen, wie man erstellen Sie eine Umgebungsvariable mit einem Zeilenumbruch in der Sie in einer busybox shell. Meine lokalen Muscheln sträuben sich es auf jeden Fall. Also ich glaube nicht, das wäre ein großes problem. Soweit POSIX sagt:
Other characters may be permitted by an implementation; applications shall tolerate the presence of such names.
also ich denke, Sie zu banalisieren und nicht erroring-out ist erträglich.