আমি কীভাবে একটি "/ proc / * / পরিবেশ" ফাইলটি আলাদা লাইনে ভাগ করব?


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কেবল লাইনটি মুদ্রণ করে।

বিভিন্ন গনুহ কমান্ড নাল-সীমা নির্দেশ করা ডেটার সাথে কাজ বিকল্প আছে: -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
xargsমুদ্রণের জন্য
ডিফল্টর

2
যদিও মনে রাখবেন যে এন্ট্রিগুলি নিখুঁতভাবে নাল-সমাপ্ত হয় কারণ এটি একমাত্র চরিত্র যা কোনও মানের অংশ হতে পারে না। আপনি যদি এগুলিকে নতুন লাইনের সাথে প্রতিস্থাপন করেন তবে আপনি সম্ভবত দুটি পর পরের রেখা দুটি ভেরিয়েবলের প্রতিনিধিত্ব করেন কিনা এমন একটি অস্পষ্টতার পরিচয় দেন বা এমন একটি ভেরিয়েবল যার মানতে একটি নিউলাইন থাকে তার পরে একটি অ্যাসাইনমেন্টের মতো দেখতে।
চিপনার

13
  • আপনি ব্যবহার করতে পারেন cut:

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

    নালকে একটি ডিলিমিটার হিসাবে ব্যবহার করে এবং একটি নতুন লাইন ডিলিমেটার আউটপুট করে optionচ্ছিকভাবে কেবল নির্দিষ্ট কিছু ক্ষেত্র / লাইন বেছে নেওয়া।

  • অথবা ফিল্টার করুন tr, নলগুলি নতুন লাইনে অনুবাদ করে:

    tr '\0' '\n' </proc/$pid/environ
  • অথবা কেবল আপনার sedসংস্করণে আটকে দিন ...


4
আমি tr '\0' '\n'যখন থেকে স্মরণ করতে পারি তখন থেকেই ব্যবহার করে আসছি। "নিউলাইনগুলির সাথে সমস্ত NUL গুলি প্রতিস্থাপন করুন" প্রকাশ করার জন্য এটি আমার সবচেয়ে স্বজ্ঞাত উপায় এবং তাই আমার ব্যক্তিগত পছন্দসই সমাধান।
egmont

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

মানুষ স্ট্রিং

NAME এর

   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

@ মুড়ুর উত্তরের ভিত্তিতে আপনি নিম্নলিখিতগুলির সাহায্যে সেই পরিবর্তনগুলি রফতানি করতে পারেন:

`cat /proc/1/environ | xargs -0 -L1 -I{} echo export {}`

1
প্রকৃতপক্ষে আমি কমান্ডটি ব্যবহার করছি:, export $(xargs -0 -a "/proc/$(pgrep gnome-session -n -U $UID)/environ")রেফারেন্স: ক্রন্টব দ্বারা চালিত বার্তাটি কীভাবে আমি বিজ্ঞপ্তি-পাঠাতে পারি?
pa4080

1
@ pa4080 আহ সুন্দর
মার্সিন
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.