ฉันจะแยกไฟล์“ / proc / * / environ” เป็นเส้นแยกได้อย่างไร


19

ฉันพยายามรับเนื้อหาของ/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มัน แต่มันคืออะไร วิธีที่เหมาะสมในการบรรลุผลลัพธ์ข้างต้นคืออะไร?

คำตอบ:


25

รายการถูกคั่นด้วยอักขระ null ดู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 file อ่านบรรทัดจาก file
  • และถ้าไม่มีการระบุคำสั่งให้xargsพิมพ์บรรทัด

คำสั่ง GNU ต่างๆมีตัวเลือกในการทำงานกับข้อมูล null คั่น: -zสำหรับsed, sort, uniq, grepฯลฯ และสำหรับชื่อไฟล์-print0ด้วยfindและ-Zด้วย grep

หรือคุณสามารถใช้ทุบตีเก่าธรรมดา:

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

-d ''บอกreadให้อ่านจนกระทั่งเป็นโมฆะ null IFS=และ-rป้องกันการแบ่งฟิลด์และแบ็กสแลช - หลบหนีเพื่อให้ข้อมูลถูกอ่านตามสภาพ%qจะอ้างอิงอักขระพิเศษในเอาต์พุต

เมื่อคุณใช้sedคุณสามารถทำได้:

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

ซึ่งเพิ่งขึ้นบรรทัดใหม่ในตอนท้ายของแต่ละบรรทัดที่คั่นด้วย null


1
+1 สำหรับค่าเริ่มต้นของxargsการพิมพ์ฉันไม่ทราบว่า
Vincent Fourmond

2
โปรดจำไว้ว่ารายการนั้นถูกยกเลิกเป็นโมฆะอย่างแม่นยำเนื่องจากเป็นอักขระตัวเดียวที่ไม่สามารถเป็นส่วนหนึ่งของค่าได้ หากคุณแทนที่พวกเขาด้วยการขึ้นบรรทัดใหม่คุณอาจแนะนำความคลุมเครือของสองบรรทัดที่ต่อเนื่องกันแทนสองตัวแปรหรือหนึ่งตัวแปรที่มีค่ามีการขึ้นบรรทัดใหม่ตามด้วยสิ่งที่ดูเหมือนการมอบหมาย
chepner

13
  • คุณสามารถใช้cut:

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

    ใช้ null เป็นตัวคั่นและแสดงผลลัพธ์ตัวคั่นบรรทัดใหม่เลือกที่จะเลือกเฉพาะบางฟิลด์ / บรรทัด

  • หรือกรองผ่านการtrแปลค่า null เป็นบรรทัดใหม่:

    tr '\0' '\n' </proc/$pid/environ
  • หรือเพียงแค่ติดกับsedรุ่นของคุณ...


4
ฉันใช้tr '\0' '\n'มาตั้งแต่ฉันจำได้ นั่นเป็นวิธีที่ง่ายที่สุดสำหรับฉันในการแสดง "แทนที่ NUL ทั้งหมดด้วยการขึ้นบรรทัดใหม่" และด้วยเหตุนี้โซลูชันที่ฉันต้องการส่วนตัว
egmont

10

คุณสามารถใช้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.

1
นั่นสวยมาก
นักโทษ

1

เมื่อสร้างคำตอบของ @ muru จากนั้นคุณสามารถส่งออกตัวแปรเหล่านั้นด้วยสิ่งต่อไปนี้:

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

1
อันที่จริงฉันใช้คำสั่ง: export $(xargs -0 -a "/proc/$(pgrep gnome-session -n -U $UID)/environ")การอ้างอิง: ฉันจะแสดงข้อความแจ้งเตือนการส่งโดย crontab ได้อย่างไร
pa4080

1
@ pa4080 อ๊ะดี
Marcin
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.