Wie teile ich eine "/ proc / * / environ" -Datei in separate Zeilen auf?

19

Ich versuche, den Inhalt einer /proc/*PID*/environDatei in einem besser lesbaren Format abzurufen. Ich kann das wie unten gezeigt tun, aber ich bin mir sicher, dass dies nicht der richtige Weg ist.

$ cat "/proc/$(pgrep gnome-session -n -U $UID)/environ"
USER=spasTEXTDOMAIN=im-configXDG_SEAT=seat0XDG_SESSION_TYPE=waylandSHLVL=1QT4_IM_MODULE=ximHOME=/home/spasDESKTOP_SESSION=ubuntuGNOME_SHELL_SESSION_MODE=ubuntuDBUS_SESSION_BUS_ADDRESS=unix:path=/run/user/1000/busIM_CONFIG_PHASE=2LOGNAME=spasGTK_IM_MODULE=ibusJOURNAL_STREAM=9:147845_=/usr/bin/gnome-sessionUSERNAME=spasXDG_SESSION_ID=70PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games:/snap/binXDG_RUNTIME_DIR=/run/user/1000LANG=en_US.UTF-8XDG_CURRENT_DESKTOP=ubuntu:GNOMEXDG_SESSION_DESKTOP=ubuntuXMODIFIERS=@im=ibusSHELL=/bin/bashGDMSESSION=ubuntuTEXTDOMAINDIR=/usr/share/locale/XDG_VTNR=2QT_IM_MODULE=ximPWD=/home/spasCLUTTER_IM_MODULE=ximXDG_DATA_DIRS=/usr/share/ubuntu:/usr/local/share:/usr/share:/var/lib/snapd/desktopXDG_CONFIG_DIRS=/etc/xdg/xdg-ubuntu:/etc/xdg
$ cat -e "/proc/$(pgrep gnome-session -n -U $UID)/environ"
USER=spas^@TEXTDOMAIN=im-config^@XDG_SEAT=seat0^@XDG_SESSION_TYPE=wayland^@SHLVL=1^@QT4_IM_MODULE=xim^@HOME=/home/spas^@DESKTOP_SESSION=ubuntu^@GNOME_SHELL_SESSION_MODE=ubuntu^@DBUS_SESSION_BUS_ADDRESS=unix:path=/run/user/1000/bus^@IM_CONFIG_PHASE=2^@LOGNAME=spas^@GTK_IM_MODULE=ibus^@JOURNAL_STREAM=9:147845^@_=/usr/bin/gnome-session^@USERNAME=spas^@XDG_SESSION_ID=70^@PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games:/snap/bin^@XDG_RUNTIME_DIR=/run/user/1000^@LANG=en_US.UTF-8^@XDG_CURRENT_DESKTOP=ubuntu:GNOME^@XDG_SESSION_DESKTOP=ubuntu^@XMODIFIERS=@im=ibus^@SHELL=/bin/bash^@GDMSESSION=ubuntu^@TEXTDOMAINDIR=/usr/share/locale/^@XDG_VTNR=2^@QT_IM_MODULE=xim^@PWD=/home/spas^@CLUTTER_IM_MODULE=xim^@XDG_DATA_DIRS=/usr/share/ubuntu:/usr/local/share:/usr/share:/var/lib/snapd/desktop^@XDG_CONFIG_DIRS=/etc/xdg/xdg-ubuntu:/etc/xdg^@
$ cat -e "/proc/$(pgrep gnome-session -n -U $UID)/environ" | sed 's/\^@/\n/g'
USER=spas
TEXTDOMAIN=im-config
XDG_SEAT=seat0
XDG_SESSION_TYPE=wayland
...

Vielleicht muss ich einen bestimmten Wert zuweisen $IFS, aber was ist das? Was ist der richtige Weg, um das obige Ergebnis zu erzielen?

pa4080
quelle

Antworten:

25

Die Einträge werden durch das Nullzeichen getrennt, siehe man 5 proc:

/proc/[pid]/environ
      This file contains the environment for the process.  The entries
      are separated by null bytes ('\0'), and there may be a null byte
      at  the  end.

So einfach ist es, sich darauf zu bewerben xargs -0 -L1:

$ xargs -0 -L1 -a /proc/self/environ
LC_CTYPE=UTF-8
USER=muru
LOGNAME=muru
HOME=/home/muru
MAIL=/var/mail/muru
SHELL=/bin/zsh
...
  • -0 - Null-getrennte Zeilen lesen,
  • -L1 - Lesen Sie eine Zeile pro Befehlsausführung
  • -a file Zeilen lesen von file
  • und wenn kein Befehl angegeben ist, xargsdruckt einfach die Zeile.

Verschiedene GNU - Befehle haben Optionen zur Arbeit mit null-getrennten Daten: -zfür sed, sort, uniq, grepusw. und für Dateinamen, -print0mit findund -Zmit grep.

Alternativ können Sie auch einfaches altes bash verwenden:

while IFS= read -d '' -r line
do
    printf "%q\n" "$line"
done < /proc/.../environ

-d ''Sagt read, dass bis zu einem Null-Byte gelesen werden soll, IFS=und -rverhindert , dass Felder geteilt und mit einem umgekehrten Schrägstrich versehen werden, damit die Daten unverändert gelesen %qwerden und Sonderzeichen in der Ausgabe angegeben werden.

Seit du es benutzt sedhast, hättest du Folgendes tun können:

sed -z 's/$/\n/' /proc/.../environ

die nur eine neue Zeile am Ende jeder durch Nullen getrennten Zeile anheftet.

muru
quelle
1
+1 für die Standardeinstellung xargszu drucken, war mir das nicht bewusst
Vincent Fourmond
2
Beachten Sie jedoch, dass die Einträge mit Nullen abgeschlossen sind, da dies das einzige Zeichen ist, das nicht Teil eines Werts sein kann. Wenn Sie sie durch Zeilenumbrüche ersetzen, kann es zu einer Mehrdeutigkeit kommen, ob zwei aufeinanderfolgende Zeilen zwei Variablen darstellen oder eine Variable, deren Wert einen Zeilenumbruch enthält, gefolgt von einer Art Zuweisung.
Chepner
13
  • Sie könnten verwenden cut:

    cut -d '' -f1- --output-delimiter=$'\n' /proc/$pid/environ

    Verwenden von null als Trennzeichen und Ausgeben eines Trennzeichens für neue Zeilen, wobei optional nur bestimmte Felder / Zeilen ausgewählt werden.

  • Oder filtern Sie durch tr, indem Sie Nullen in Zeilenumbrüche übersetzen:

    tr '\0' '\n' </proc/$pid/environ
  • Oder bleib einfach bei deiner sedVersion ...

Xen2050
quelle
4
Ich benutze tr '\0' '\n'seit ich mich erinnern kann. Das ist für mich die intuitivste Möglichkeit, "Alle NULs durch Zeilenumbrüche ersetzen" und damit meine persönliche bevorzugte Lösung auszudrücken.
egmont
10

Sie können stringswie folgt verwenden:

strings /proc/$(pgrep gnome-session -n -U $UID)/environ

Beispiel der Ausgabe:

$ strings /proc/$(pgrep gnome-session -n -U $UID)/environ
GNOME_KEYRING_PID=
LANGUAGE=en_US
J2SDKDIR=/usr/lib/jvm/java-8-oracle
LC_TIME=en_US.UTF-8
XDG_SEAT=seat0
XDG_SESSION_TYPE=x11
COMPIZ_CONFIG_PROFILE=ubuntu
SESSION=ubuntu

Mann Saiten

NAME

   strings - print the strings of printable characters in files.

BESCHREIBUNG

   For each file given, GNU strings prints the printable character
   sequences that are at least 4 characters long (or the number given with
   the options below) and are followed by an unprintable character.  By
   default, it only prints the strings from the initialized and loaded
   sections of object files; for other types of files, it prints the
   strings from the whole file.

   strings is mainly useful for determining the contents of non-text
   files.
Yaron
quelle
1
Das ist schön.
Gefangener
1

Aufbauend auf der Antwort von @ muru können Sie diese Variablen dann wie folgt exportieren:

`cat /proc/1/environ | xargs -0 -L1 -I{} echo export {}`
Marcin
quelle
1
Tatsächlich verwende ich den Befehl :,export $(xargs -0 -a "/proc/$(pgrep gnome-session -n -U $UID)/environ") Referenz: Wie kann ich Benachrichtigungen anzeigen, die von crontab ausgelöst werden?
pa4080
1
@ pa4080 Ah nice
Marcin