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

항목은 널 문자로 구분됩니다. 참조 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 명령은 널 (null)로 구분 된 데이터로 작업 옵션을 사용할 수 있습니다 -z에 대한 sed, sort, uniq, grep등, 및 파일 이름, -print0find-ZGREP와.

또는 일반 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

널로 구분 된 각 줄 끝에서 줄 바꿈을 수행합니다.


1
xargs인쇄 의 기본값으로 +1 , 나는 그것을
몰랐다

2
그러나 항목은 값의 일부가 될 수없는 유일한 문자 이므로 정확하게 null로 종료됩니다 . 이들을 개행으로 바꾸면 두 개의 연속 된 선이 두 개의 변수를 나타내는 지 또는 값에 개행을 포함하고 그 뒤에 대입처럼 보이는 변수가있는 하나의 변수가 모호해질 수 있습니다.
chepner

13
  • 당신은 사용할 수 있습니다 cut:

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

    널을 구분 기호로 사용하고 개행 구분 기호를 출력하여 선택적으로 특정 필드 / 줄만 선택합니다.

  • 또는을 통해 필터링하여 trnull을 줄 바꿈으로 변환합니다.

    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
아름답습니다.
죄수

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.