我正在尝试以/proc/*PID*/environ
更易读的格式获取任何文件的内容。我可以通过下面显示的方式做到这一点,但我确信这不是正确的方式。
$ 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
...
也许我必须为 分配一个特定的值$IFS
,但它是什么?实现上述结果的正确方法是什么?
条目由空字符分隔,请参阅
man 5 proc
:所以一个简单的方法是应用
xargs -0 -L1
它:-0
- 读取空分隔的行,-L1
- 每次执行命令读取一行-a file
从file
xargs
则只打印该行。各种 GNU 命令具有处理空分隔数据的选项:
-z
forsed
、sort
、uniq
等grep
,以及用于文件名的选项,-print0
使用grepfind
和-Z
使用 grep。或者,您可以使用普通的旧 bash:
-d ''
告诉read
读取直到一个空字节,IFS=
并-r
防止字段拆分和反斜杠转义,以便按原样读取数据,%q
将在输出中引用特殊字符。既然你确实使用
sed
了,你可以这样做:它只是在每个空分隔行的末尾添加一个换行符。
你可以使用
cut
:使用 null 作为分隔符,并输出换行符分隔符,可选择仅选择某些字段/行。
或过滤
tr
,将空值转换为换行符:或者只是坚持你的
sed
版本......您可以
strings
按如下方式使用:输出样本:
人弦
“man proc”,搜索“environ”,帮助文本说:
基于@muru 的答案,您可以使用以下内容导出这些变量:
首先将如何工作
hexdump -v -e '/1 "%02X "' /proc/PID/environ
(如果您将 PID 替换为程序或自身的 pid)以十六进制打印所有文件,并以空格分隔。接下来,我将它导入sed -e 's/00/0a/g'
其中,将所有 00 aka nulls 用作每个条目的分隔符并将它们转换为换行符。以免我xxd -r -p
用来将十六进制转换回二进制即可读文本。