如何在单独的行中拆分“/ proc / * / environ”文件?

我试图以更易读的格式获取任何/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

 /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. 

所以一个简单的方法是在它上面应用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分隔的行,
  • -L1 – 每次执行命令读取一行
  • -a filefile读取行
  • 如果没有指定命令, xargs只打印该行。

各种GNU命令可以选择使用空分隔数据: -z用于sedsortuniqgrep等,对于文件名, -print0find-Z用grep。

或者,您可以使用普通的旧bash:

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

-d ''告诉read读取直到空字节, IFS=-r阻止字段拆分和反斜杠转义,以便按原样读取数据, %q将引用输出中的特殊字符。

既然你使用了sed ,你可以做到:

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

它只是在每个空分隔行的末尾添加换行符。

  • 你可以使用cut

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

    使用null作为分隔符,并输出换行符分隔符,可选择仅选择某些字段/行。

  • 或者通过tr过滤,将空值转换为换行符:

     tr '\0' '\n'  
  • 或者只是坚持你的sed版本......

您可以按如下方式使用strings

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

输出样本:

 $ 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 

男人的弦

名称

  strings - print the strings of printable characters in files. 

描述

  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. 

在@ muru的答案的基础上,您可以使用以下内容导出这些变量:

 `cat /proc/1/environ | xargs -0 -L1 -I{} echo export {}`