I'm trying to get the content of any /proc/*PID*/environ
file in more readable format. I'm able to do that in the way shown below, but I'm sure this isn't the proper way.
$ 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
...
Maybe I must assign a specific value to $IFS
, but what is it? What is the proper way to achieve the above result?
The entries are separated by the null character, see
man 5 proc
:So a simple way is to apply
xargs -0 -L1
on it:-0
- read null-delimited lines,-L1
- read one line per execution of command-a file
read lines fromfile
xargs
simply prints the line.Various GNU commands have options to work with null-delimited data:
-z
forsed
,sort
,uniq
,grep
etc, and for filenames,-print0
withfind
and-Z
with grep.Alternatively, you can use plain old bash:
-d ''
tellsread
to read until a null byte,IFS=
and-r
prevent field-splitting and backslash-escaping, so that the data is read as-is,%q
will quote special characters in output.Since you did use
sed
, you could have done:which just tacks on a newline at the end of each null-delimited line.
You could use
cut
:using null as a delimiter, and outputting a newline delimiter, optionally picking only certain fields/lines.
Or filter through
tr
, translating nulls to newlines:Or just stick with your
sed
version...You can use
strings
as follows:Sample of the output:
man strings
"man proc", search "environ", help text says:
Building on @muru's answer, you can then export those variables with the following:
how does this work first
hexdump -v -e '/1 "%02X "' /proc/PID/environ
will (if you replace PID with the pid of the program or self) print all of the file in hex with bite separated with a space. next i pipe it intosed -e 's/00/0a/g'
which takes all 00 aka nulls which are used as separators for each entry and converts them into newlines. lest i usexxd -r -p
to convert back the hex to binary aka readable text.