web-dev-qa-db-ja.com

「/ 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に特定の値を割り当てる必要があるかもしれませんが、それは何ですか?上記の結果を達成するための適切な方法は何ですか?

16
pa4080

エントリはヌル文字で区切られます。 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-コマンドの実行ごとに1行を読み取ります
  • -a filefileから行を読み取ります
  • コマンドが指定されていない場合、xargsは単に行を出力します。

さまざまなGNUコマンドには、nullで区切られたデータを処理するオプションがあります。sedsortuniqgrepなど、およびファイル名の-z-print0 with findおよび-Z with grep。

または、プレーンな古いbashを使用できます。

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

これは、ヌルで区切られた各行の終わりに改行を追加するだけです。

22
muru
  • cutを使用できます:

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

    nullを区切り文字として使用し、改行区切り文字を出力し、オプションで特定のフィールド/行のみを選択します。

  • または、trをフィルタリングして、ヌルを改行に変換します。

    tr '\0' '\n' </proc/$pid/environ
    
  • または、sedバージョンをそのまま使用します...

12
Xen2050

次のように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.
9
Yaron

@muruの答えに基づいて、次のようにしてこれらの変数をエクスポートできます。

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