Mit sed, um eine env-var von /proc/*/environ Verrücktheit mit \x00
Ich versuche zu winseln durch einige andere Prozesse, die Umgebung zu bekommen, eine bestimmte env var.
So, ich habe versucht, einen sed-Befehl wie:
sed -n "s/\x00ENV_VAR_NAME=\([^\x00]*\)\x00/\1/p" /proc/pid/environ
Aber ich bekomme als Ausgabe die volle environ-Datei. Wenn ich die Stelle des \1 mit nur einer statischen string, bekomme ich diesen string plus die gesamte Umwelt-Datei:
sed -n "s/\x00ENV_VAR_NAME=\([^\x00]*\)\x00/BLAHBLAH/p" /proc/pid/environ
Ich soll einfach immer "BLAHBLAH" im letzten Beispiel. Dies geschieht nicht, wenn ich loszuwerden, die null-chars und einige andere test-Daten.
Dies führte mich zu versuchen, die Umwandlung der \x00 bis \x01 ' s, die nicht zu funktionieren scheinen:
cat /proc/pid/environ | tr '\000' '\001' | sed -n "s/\x01ENV_VAR_NAME=\([^\x01]*\)\x01/\1/p"
Bin ich etwas fehlt, einfach über die sed hier? Oder sollte ich nur stick auf diese Lösung?
Du musst angemeldet sein, um einen Kommentar abzugeben.
Nun kann man die Liste mit gawk, den Rekord separator
\0
- und der Feld-separator, um=
:Oder verwenden Sie
read
in einer Schleife zu Lesen, jeden NULL-Linie abgegrenzt. Zum Beispiel:(Tun Sie das in einer sub-shell zu vermeiden, die Stress für Ihre eigene Umgebung.)
awk
funktioniert nicht, wenn der Wert der Variablen enthält=
? eg:awk -v 'RS=\0' -F= '$1=="LS_COLORS" {print $2}' < /proc/self/environ
FAIL=2+2=4
Viele Programme in C geschrieben ist, eher fehl mit Zeichenfolgen mit eingebetteten NULs als NUL beendet einen C-Stil-string. Es sei denn, speziell geschrieben ist, es zu handhaben.
Ich /proc/*/environ auf der Kommandozeile mit xargs:
Dies gibt Ihnen eine env-var pro Zeile. Ohne einen Befehl xargs nur echos das argument. Sie können dann einfach mit grep, sed, awk, etc. auf, die durch Rohrleitungen zu.
Ich es oft genug, dass ich eine shell-Funktion für Sie:
Diese Ihnen die Umwelt von einer bestimmten pid, oder selbst wenn kein argument angegeben wird.
xargs -n 1 -0 printf "%s " < /proc/pid/environ && echo
xargs
unterstützt die-0
option, aber es kann nicht aktiviert werden, in der Standard-Konfiguration. (Dies kann relevant sein, um diese läuft embedded Linux.)dann kopieren und einfügen, wie gebraucht.
Trotz der sehr alt und die Frage geantwortet haben, ich bin das hinzufügen einer sehr einfachen oneliner, wahrscheinlich einfacher für die text-Ausgabe und Weiterverarbeitung:
| grep -E '^(ENV_NAME)='
Aus irgendeinem Grund sed nicht mit \0 mit
.
Lösung: verwenden Sie keine sed oder Ihre Umgehung.