/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
に特定の値を割り当てる必要があるかもしれませんが、それは何ですか?上記の結果を達成するための適切な方法は何ですか?
エントリはヌル文字で区切られます。 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コマンドには、nullで区切られたデータを処理するオプションがあります。sed
、sort
、uniq
、grep
など、およびファイル名の-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
これは、ヌルで区切られた各行の終わりに改行を追加するだけです。
cut
を使用できます:
cut -d '' -f1- --output-delimiter=$'\n' /proc/$pid/environ
nullを区切り文字として使用し、改行区切り文字を出力し、オプションで特定のフィールド/行のみを選択します。
または、tr
をフィルタリングして、ヌルを改行に変換します。
tr '\0' '\n' </proc/$pid/environ
または、sed
バージョンをそのまま使用します...
次のように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.
@muruの答えに基づいて、次のようにしてこれらの変数をエクスポートできます。
`cat /proc/1/environ | xargs -0 -L1 -I{} echo export {}`