“/ Proc / * / environ” dosyasını ayrı satırlara nasıl bölerim?


19

Herhangi bir /proc/*PID*/environdosyanın içeriğini daha okunabilir biçimde almaya çalışıyorum . Bunu aşağıda gösterilen şekilde yapabilirim, ancak eminim bu doğru bir yol değildir.

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

Belki belirli bir değer atamalıyım $IFS, ama nedir? Yukarıdaki sonuca ulaşmanın doğru yolu nedir?

Yanıtlar:


25

Girişler boş karakterle ayrılır, bakınız 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.

Bu yüzden basit bir yol xargs -0 -L1üzerine uygulamaktır :

$ 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 - boş sınırlandırılmış satırları okuyun,
  • -L1 - komutun yürütülmesi başına bir satır okuma
  • -a file satırları oku file
  • ve herhangi bir komut belirtilmezse, xargssatırı yazdırır.

Çeşitli GNU komutları boş ayrılmış verilerle çalışmak için seçenekler vardır: -ziçin sed, sort, uniq, grepvb ve dosya adları için, -print0birlikte findve -Zgrep ile.

Alternatif olarak, düz eski bash kullanabilirsiniz:

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

-d ''readboş bir bayt olana kadar okumayı söyler IFS=ve -ralan bölünmesini ve ters eğik çizgiden kaçmayı engeller, böylece veriler olduğu gibi okunur %q, çıktıdaki özel karakterler belirtilir.

Kullandığınızdan beri şunları sedyapabilirsiniz:

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

her boş satırın sonunda yeni bir satıra yapışır.


1
Varsayılan xargsbaskı için +1 , bunun farkında
değildim

2
Yine de, bir değerin parçası olamayacak tek karakter olduğundan girdilerin tam olarak sonlandırıldığını unutmayın. Bunları yeni satırlarla değiştirirseniz, iki ardışık satırın iki değişkeni mi yoksa değeri bir satırsonu ve ardından atama gibi görünen bir değişkeni mi temsil ettiği konusunda bir belirsizlik ortaya koyabilirsiniz.
chepner

13
  • Şunları kullanabilirsiniz cut:

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

    null değerinin bir sınırlayıcı olarak kullanılması ve yeni satır sınırlayıcısının çıktısının alınması, isteğe bağlı olarak yalnızca belirli alanların / satırların seçilmesi.

  • Veya trboş satırları yeni satırlara çevirerek filtreleyin :

    tr '\0' '\n' </proc/$pid/environ
  • Veya sedsürümünüze sadık kalın ...


4
tr '\0' '\n'Hatırlayabildiğimden beri kullanıyorum . "Tüm NUL'ları yeni satırlarla değiştir" ifadesini ve dolayısıyla kişisel olarak tercih ettiğim çözümü ifade etmenin en sezgisel yolu budur.
egmont

10

Aşağıdaki gibi kullanabilirsiniz strings:

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

Çıktı örneği:

$ 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

adam dizeleri

ADI

   strings - print the strings of printable characters in files.

AÇIKLAMA

   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
Bu çok güzel.
Mahkum

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.