AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • 主页
  • 系统&网络
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • 主页
  • 系统&网络
    • 最新
    • 热门
    • 标签
  • Ubuntu
    • 最新
    • 热门
    • 标签
  • Unix
    • 最新
    • 标签
  • DBA
    • 最新
    • 标签
  • Computer
    • 最新
    • 标签
  • Coding
    • 最新
    • 标签
主页 / ubuntu / 问题 / 978711
Accepted
pa4080
pa4080
Asked: 2017-11-22 01:35:50 +0800 CST2017-11-22 01:35:50 +0800 CST 2017-11-22 01:35:50 +0800 CST

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

  • 772

我正在尝试以/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,但它是什么?实现上述结果的正确方法是什么?

command-line
  • 6 6 个回答
  • 16841 Views

6 个回答

  • Voted
  1. Best Answer
    muru
    2017-11-22T01:40:12+08:002017-11-22T01:40:12+08:00

    条目由空字符分隔,请参阅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- 读取空分隔的行,
    • -L1- 每次执行命令读取一行
    • -a file从file
    • 如果没有指定命令,xargs则只打印该行。

    各种 GNU 命令具有处理空分隔数据的选项:-zfor sed、sort、uniq等grep,以及用于文件名的选项,-print0使用grepfind和-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
    

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

    • 49
  2. Xen2050
    2017-11-22T02:02:28+08:002017-11-22T02:02:28+08:00
    • 你可以使用cut:

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

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

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

      tr '\0' '\n' </proc/$pid/environ
      
    • 或者只是坚持你的sed版本......

    • 19
  3. Yaron
    2017-11-22T01:41:28+08:002017-11-22T01:41:28+08:00

    您可以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.
    
    • 16
  4. shengmx
    2020-04-01T20:04:59+08:002020-04-01T20:04:59+08:00

    “man proc”,搜索“environ”,帮助文本说:

    因此,要打印出流程 1 的环境,您可以:

    $ strings /proc/1/environ
    
    • 3
  5. Marcin
    2018-10-12T16:45:32+08:002018-10-12T16:45:32+08:00

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

    `cat /proc/1/environ | xargs -0 -L1 -I{} echo export {}`
    
    • 2
  6. lnee
    2021-10-11T10:49:36+08:002021-10-11T10:49:36+08:00
    hexdump -v -e '/1 "%02X "' /proc/PID/environ |sed -e 's/00/0a/g' | xxd -r -p 
    

    首先将如何工作hexdump -v -e '/1 "%02X "' /proc/PID/environ(如果您将 PID 替换为程序或自身的 pid)以十六进制打印所有文件,并以空格分隔。接下来,我将它导入sed -e 's/00/0a/g'其中,将所有 00 aka nulls 用作每个条目的分隔符并将它们转换为换行符。以免我xxd -r -p用来将十六进制转换回二进制即可读文本。

    • -4

相关问题

  • 如何从命令行仅安装安全更新?关于如何管理更新的一些提示

  • 如何从命令行刻录双层 dvd iso

  • 如何从命令行判断机器是否需要重新启动?

  • 文件权限如何工作?文件权限用户和组

  • 如何在 Vim 中启用全彩支持?

Sidebar

Stats

  • 问题 205573
  • 回答 270741
  • 最佳答案 135370
  • 用户 68524
  • 热门
  • 回答
  • Marko Smith

    如何运行 .sh 脚本?

    • 16 个回答
  • Marko Smith

    如何安装 .tar.gz(或 .tar.bz2)文件?

    • 14 个回答
  • Marko Smith

    如何列出所有已安装的软件包

    • 24 个回答
  • Marko Smith

    无法锁定管理目录 (/var/lib/dpkg/) 是另一个进程在使用它吗?

    • 25 个回答
  • Martin Hope
    Flimm 如何在没有 sudo 的情况下使用 docker? 2014-06-07 00:17:43 +0800 CST
  • Martin Hope
    Ivan 如何列出所有已安装的软件包 2010-12-17 18:08:49 +0800 CST
  • Martin Hope
    La Ode Adam Saputra 无法锁定管理目录 (/var/lib/dpkg/) 是另一个进程在使用它吗? 2010-11-30 18:12:48 +0800 CST
  • Martin Hope
    David Barry 如何从命令行确定目录(文件夹)的总大小? 2010-08-06 10:20:23 +0800 CST
  • Martin Hope
    jfoucher “以下软件包已被保留:”为什么以及如何解决? 2010-08-01 13:59:22 +0800 CST
  • Martin Hope
    David Ashford 如何删除 PPA? 2010-07-30 01:09:42 +0800 CST

热门标签

10.10 10.04 gnome networking server command-line package-management software-recommendation sound xorg

Explore

  • 主页
  • 问题
    • 最新
    • 热门
  • 标签
  • 帮助

Footer

AskOverflow.Dev

关于我们

  • 关于我们
  • 联系我们

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve