「/ 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 -コマンドの実行ごとに1行を読み取る
  • -a file 行を読む file
  • コマンドが指定されていない場合は、xargs単に行を出力します。

様々なGNUコマンドはヌル区切りデータとの仕事にオプションがあります-zためsedsortuniqgrepなど、およびファイル名の、-print0findして-Zgrepを持ちます。

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

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

-d ''readnullバイトまで読み込むように指示し、フィールド分割とバックスラッシュエスケープIFS=-r防止します。これにより、データがそのまま読み込まれ%q、出力で特殊文字が引用されます。

を使用したのでsed、次のことができます。

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

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


1
xargs印刷のデフォルトの+1 、私はそれを知らなかった
ビンセント・フォーモンド

2
ただし、エントリは値の一部になれない唯一の文字であるため、エントリは正確にヌルで終了することに注意してください。それらを改行で置き換えると、2つの連続した行が2つの変数を表すのか、値に改行があり、その後に代入のように見える変数が1つあるのかを曖昧にする可能性があります。
チェプナー

13
  • 以下を使用できますcut

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

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

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

    tr '\0' '\n' </proc/$pid/environ
  • または、単にあなたのsedバージョンに固執する...


4
思い出せるようになってtr '\0' '\n'からずっと使っています。それは私にとって「すべてのNULを改行で置き換える」ことを表現する最も直感的な方法であり、したがって、私の個人的な好みのソリューションです。
エグモント

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ああ素敵
マルチン
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.