Bagaimana cara memisahkan file "/ proc / * /viron" di baris yang berbeda?

19

Saya mencoba untuk mendapatkan konten dari /proc/*PID*/environfile apa pun dalam format yang lebih mudah dibaca. Saya dapat melakukannya dengan cara yang ditunjukkan di bawah ini, tetapi saya yakin ini bukan cara yang tepat.

$ 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
...

Mungkin saya harus memberikan nilai tertentu $IFS, tetapi apa itu? Apa cara yang tepat untuk mencapai hasil di atas?

pa4080
sumber

Jawaban:

25

Entri dipisahkan oleh karakter nol, lihat 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.

Jadi cara sederhana adalah menerapkannya 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 - baca baris tanpa batas,
  • -L1 - baca satu baris per eksekusi perintah
  • -a file baca baris dari file
  • dan jika tidak ada perintah yang ditentukan, xargscukup cetak baris.

Berbagai perintah GNU memiliki opsi untuk bekerja dengan data null-delimited: -zuntuk sed, sort, uniq, grepdll, dan untuk nama file, -print0dengan finddan -Zdengan grep.

Atau, Anda dapat menggunakan bash lama:

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

-d ''memberitahu readuntuk membaca sampai byte nol, IFS=dan -rmencegah pemisahan bidang dan backslash-melarikan diri, sehingga data dibaca apa adanya, %qakan mengutip karakter khusus dalam output.

Karena Anda menggunakannya sed, Anda bisa melakukan:

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

yang hanya menyadap baris baru di akhir setiap baris tanpa batas nol.

muru
sumber
1
+1 untuk standar xargspencetakan, saya tidak menyadarinya
Vincent Fourmond
2
Perlu diingat, bahwa entri-entri tersebut diakhiri dengan null justru karena itu adalah satu-satunya karakter yang tidak dapat menjadi bagian dari nilai. Jika Anda menggantinya dengan baris baru, Anda berpotensi memperkenalkan ambiguitas apakah dua baris berturut-turut mewakili dua variabel, atau satu variabel yang nilainya berisi baris baru diikuti oleh apa yang tampak seperti tugas.
chepner
13
  • Anda bisa menggunakan cut:

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

    menggunakan null sebagai pembatas, dan mengeluarkan pembatas baris baru, secara opsional memilih hanya bidang / baris tertentu.

  • Atau filter melalui tr, menerjemahkan null ke baris baru:

    tr '\0' '\n' </proc/$pid/environ
  • Atau tetap dengan sedversi Anda ...

Xen2050
sumber
4
Saya telah menggunakan tr '\0' '\n'sejak saya bisa mengingat. Itulah cara paling intuitif bagi saya untuk mengekspresikan "ganti semua NUL dengan baris baru", dan karenanya solusi pilihan pribadi saya.
egmont
10

Anda dapat menggunakan stringssebagai berikut:

strings /proc/$(pgrep gnome-session -n -U $UID)/environ

Contoh dari output:

$ 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

string pria

NAMA

   strings - print the strings of printable characters in files.

DESKRIPSI

   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.
Yaron
sumber
1
itu indah.
Tahanan
1

Membangun jawaban @ muru, Anda kemudian dapat mengekspor variabel-variabel tersebut dengan yang berikut:

`cat /proc/1/environ | xargs -0 -L1 -I{} echo export {}`
Marcin
sumber
1
Sebenarnya saya menggunakan perintah:, export $(xargs -0 -a "/proc/$(pgrep gnome-session -n -U $UID)/environ")referensi: Bagaimana saya bisa menampilkan notifikasi-kirim pesan yang dipicu oleh crontab?
pa4080
1
@ pa4080 Ah bagus
Marcin