Як розділити файл "/ proc / * / environment" на окремі рядки?


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 - читати один рядок на виконання команди
  • -a file читати рядки з file
  • і якщо не вказана жодна команда, xargsпросто надрукується рядок.

Різні команди GNU мають опції для роботи з даними нуля-розмежовано: -zдля sed, sort, uniq, і grepт.д., і для імен файлів, -print0з findі -Zз Grep.

Крім того, ви можете використовувати звичайний старий баш:

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

-d ''говорить readчитати до нульового байта IFS=і -rзапобігати поділу поля та відхиленню від косої риси, так що дані, прочитані як є, %qцитують спеціальні символи у висновку.

Оскільки ви користувались sed, ви могли:

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

який просто вказує на новий рядок в кінці кожного обмеженого нулем рядка.


1
+1 для типового xargsдруку, я про це не знав
Вінсент Фурмонд

2
Майте на увазі, що записи скасовуються з нулем саме тому, що це єдиний символ, який не може бути частиною значення. Якщо ви заміните їх на нові рядки, ви потенційно можете ввести неоднозначність, чи є два послідовні рядки двома змінними, або одна змінна, значення якої містить новий рядок, після чого буде схоже на призначення.
чепнер

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 Ah nice
Marcin
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.