পরিবেশের ভেরিয়েবলের বর্তমান মানটি কীভাবে দেখানো যায়?


24

আমি যখন আমার সিস্টেমের পরিবেশ পরীক্ষা করি তখন প্রচুর পরিবেশগত পরিবর্তনশীল পপ আপ হয়ে যায়। আমি কীভাবে কেবল একটি নির্দিষ্ট চলকটি অনুসন্ধান করতে পারি?

একটি বই আমি পড়ছি যা বলে:

কখনও কখনও আপনার পরিবেশে ভেরিয়েবলের সংখ্যা বেশ বড় হয়, তাই আপনি যখন কেবল একটিতে আগ্রহী হন তখন প্রদর্শিত সমস্ত মান আপনি দেখতে চান না। যদি এটি হয় তবে আপনি echoপরিবেশের ভেরিয়েবলের বর্তমান মানটি প্রদর্শন করতে কমান্ডটি ব্যবহার করতে পারেন ।

আমি লিনাক্স টার্মিনালে এটি কীভাবে করব?

উত্তর:


25

শুধু:

echo "$VARIABLENAME"

এনভায়রনমেন্ট ভেরিয়েবলের উদাহরণস্বরূপ $HOME, ব্যবহার করুন:

echo "$HOME"

যা এর অনুরূপ কিছু মুদ্রণ করে:

/home/username

সম্পাদনা করুন : স্টাফেন চেজেলাসের মন্তব্য অনুসারে , আপনি যদি এর printenvপরিবর্তে ব্যবহার করেন তবে ভাল হতে পারে echo:

printenv HOME

4
আপনি উদ্ধৃতিগুলি ভুলে গেছেন (যদি না আপনি zsh বা rc / es সিনট্যাক্স বোঝাচ্ছেন)) echoএকটি কমান্ডের দুর্বল পছন্দ কারণ এটি ভেরিয়েবলের বিষয়বস্তুকে রূপান্তরিত করতে পারে। এটি শেল প্যারামিটারের সামগ্রীটি একই নামে আউটপুট করবে। উদাহরণস্বরূপ 1, বোর্ন শেল ব্যবহার করা বা এনভির ওয়ার্সের মতো ব্যবহার করা একই নয় *। এবং আপনি এনভির ভার্সের জন্য সেই পদ্ধতির ব্যবহার করতে পারবেন না যার নামটি শেল ভেরিয়েবলের নাম হিসাবে বৈধ নয়।
স্টাফেন চেজেলাস

5
এছাড়াও মনে রাখবেন যে একই নামের সাথে বেশ কয়েকটি পরিবেশের প্রবেশ রয়েছে (ঠিক আছে, একটি প্যাথলজিকাল কেস), যা আপনি পাবেন তা শেলের উপর নির্ভর করে (সাধারণত প্রথমটি হয় বা শেষেরটি হয়)। printenv VARএগুলি সমস্ত প্রদর্শন করবে (কমপক্ষে GNU বাস্তবায়নের জন্য)।
স্টাফেন চেজেলাস

9

সম্পাদন করে:

printenv

আপনি সমস্ত পরিবেশের পরিবর্তনশীল দেখতে পাবেন। আরও তথ্যের জন্য আপনি এখানে একবার দেখে নিতে পারেন:

https://www.digitalocean.com/community/tutorials/how-to-read-and-set-environmental-and-shell-variables-on-a-linux-vps


2
প্রকৃতপক্ষে প্রশ্নের উত্তরের কাছাকাছি আসতে printenv variablenameকেবল নামমাত্র ভেরিয়েবলটি প্রদর্শিত হবে; উদাহরণস্বরূপ, printenv  HOMEপ্রায় একই জিনিস করতে হবে echo  "$HOME"
জি-ম্যান বলে 12 '

5

এটি বুঝতে গুরুত্বপূর্ণ যে প্রতিটি প্রক্রিয়াতে পরিবেশের ভেরিয়েবলগুলির নিজস্ব সেট রয়েছে।

যখন কোনও প্রক্রিয়া fork()সিস্টেম কলকে কল করে, প্রথম ( পিতামাতার ) অনুরূপ একটি দ্বিতীয় প্রক্রিয়া ( শিশু ) তৈরি করা হয় (এই অনুলিপিতে পরিবেশ অন্তর্ভুক্ত রয়েছে, যা স্ট্যাকের ঠিক উপরে নির্ভর করে (বা ঠিক নীচে, আপনি কীভাবে স্ট্যাকের কথা ভাবেন - তবে ইউনিক্স / লিনাক্সে স্ট্যাকটি উচ্চ ঠিকানা থেকে নীচে নেমে আসে)।:-)

সাধারণত, শিশু প্রক্রিয়া তারপরে execve()সিস্টেম কল কল করবে, যা এর (ভার্চুয়াল) মেমরির সমস্ত কিছু ফেলে দেবে এবং পুনর্গঠন করবে এবং নির্দিষ্ট বাইনারি ফাইলের কোড এবং ডেটা বিভাগগুলি থেকে এটি করবে।

যাইহোক, যখন এটি reconstructs স্ট্যাক, এটা কপি পরিবেশ ও যুক্তি স্ট্রিং পাস execve()স্ট্যাকের সম্মুখের প্রথম (যাতে), কল করার আগে main()ফাংশন (কাজ অনেক মধ্যে সম্পন্ন করা হয় crt0পরে বুটস্ট্র্যাপ কোড execve()(রিটার্ন এন্ট্রি বিন্দু বাইনারি নির্দিষ্ট ))।

execve()সি লাইব্রেরিতে সিস্টেম কলের জন্য মোড়ক রয়েছে যা বর্তমান পরিবেশটি (যেমন পিতামাতার পরিবেশনের একটি অনুলিপি) পাস করবে, কলারের পরিবর্তে এটি সরবরাহ করবে (সুতরাং বাস্তবে শিশু পিতামাতার পরিবেশের উত্তরাধিকারী হবে ) - দেখুন environ(7)

কমান্ড চালানোর চেষ্টা করুন (রুট হিসাবে) ps axeww | less... এটি আপনাকে সমস্ত প্রক্রিয়াটির পরিবেশ দেখায় ! মজার একটি হ'ল প্রসেস আইডি 1 (যেমন initপ্রক্রিয়া - বুট সময়ে কার্নেল দ্বারা নির্মিত প্রথম প্রক্রিয়া)।

যদি আপনি কোনও নির্দিষ্ট প্রক্রিয়ার জন্য পরিবেশটি দেখতে চান (এবং আপনি এটির প্রক্রিয়া আইডিটি জানেন), কমান্ডটি চালানোর চেষ্টা করুন cat /proc/<PID>/environ( <PID>প্রক্রিয়া আইডির পরিবর্তে )।

মনে রাখবেন যে কোনও প্রক্রিয়াতে পর্যাপ্ত সুযোগ-সুবিধাগুলি থাকলে এটি তার নিজস্ব স্ট্যাকটি পুনরায় লিখতে পারে, যা এর পরিবেশটি কী তা জানতে অসুবিধা করতে পারে - আপনি পিএস আউটপুটে এই জাতীয় কিছু ডিমন প্রক্রিয়া দেখতে পাবেন।

তবে শেষ অবধি, এই সমস্ত ভ্যাফলটি উপরে উঠেছিল @ শ্যাওসগুলি উপরে কি বলেছে, আপনি যদি নিজের শেল প্রক্রিয়াতে একটি নির্দিষ্ট পরিবেশের পরিবর্তনশীলের বর্তমান মানটি দেখতে চান তবে কেবল (বিল্টিন) কমান্ডটি ব্যবহার করুন ( এর নামের সাথে echo "$<NAME>"প্রতিস্থাপন করে ) <NAME>এনভায়রনমেন্ট ভেরিয়েবল আপনার আগ্রহী) ... কেবলমাত্র সচেতন থাকুন যে একই ভেরিয়েবলের অন্য কোনও প্রক্রিয়াতে আলাদা মান থাকতে পারে বা অস্তিত্ব থাকতে পারে না।


1
(1) নোট করুন যে eবিকল্পটি psএবং /proc/…/environবিশেষ ফাইল সমস্ত সিস্টেমে নাও থাকতে পারে। (২) আফাইক, প্রতিটি ইউনিক্স প্রক্রিয়াতে তার স্ট্যাকটি পুনরায় লেখার এবং তার পরিবেশের পরিবর্তনশীলগুলি সংশোধন করার সুযোগ রয়েছে। (3) আরও আলোচনার জন্য, দেখুন পরিবেশের ভেরিয়েবলগুলি কার সাথে সম্পর্কিত? ( সুপার ব্যবহারকারীর উপর )।
জি-ম্যান

আমার মাথায় এটি ছিল যে কিছু সিস্টেমের একটি অনিবদ্ধ প্রক্রিয়াটিকে কমান্ড লাইন আর্গুমেন্ট এবং পরিবেশ যেমন "রুট চালানো" থেকে "আড়াল করা" থেকে রোধ করার একটি উপায় ছিল ps... তবে এখন আপনি এই বিষয়টি হাইলাইট করেছেন, কেন আমি মনে করতে পারি না কেন আমি যে চিন্তা.
মারে জেনসেন

@ মুরেজেনসেন উচ্চ ভোটপ্রাপ্ত প্রশ্ন সম্পর্কে কিছু আলোচনার ভিত্তিতে আমি "কার্ল" সম্পর্কে পিএস-এ তার আর্গুমেন্টগুলি লুকিয়ে রাখার বিষয়ে জিজ্ঞাসা করেছি — এটি পসিএক্সে অনির্ধারিত ps প্রসেসটি মূলত প্রক্রিয়াতে প্রেরণ করা আর্গুমেন্টগুলি ফিরিয়ে দেয় কিনা, বা একটি অনুলিপি যা প্রক্রিয়াটি পরে সংশোধিত হতে পারে শুরু হয়। কিছু সিস্টেম (আমার মনে হয় সোলারিস ??) আসল আরোগুলি দেখায় যাই হোক না কেন। (এখানে লিঙ্কটি দেওয়া আছে )) আপনি যা ভাবছিলেন তা এটিই হতে পারে। :)
ওয়াইল্ডকার্ড

বিঙ্গো! হ্যাঁ, অবশ্যই সোলারিস এটি "সঠিকভাবে" করেছেন :-) রিফ্রেশারের জন্য ধন্যবাদ ...
মারে জেনসেন


1

যদি আপনাকে প্রচুর ভার্সেস সেট করতে হয়:

  ( set -o posix ; set ) | sort >~/vars.before

তাদের সেট করার পরে:

  ( set -o posix ; set ) | sort >~/vars.after

সেট করা হয়েছে তা প্রদর্শন করার চেয়ে:

  comm -3 ~/vars.before ~/vars.after | perl -ne 's#\s+##g;print "\n $_ "'

আপনি শিগগিরই নিজেকে খুঁজে পাবেন, সিএনএফ ফাইলগুলিতে প্রাক-সংজ্ঞায়িত শেল ওয়ার্সের একাধিক সেটের সাথে কাজ করা, যা tmux এর সাথে মিলিয়ে আপনাকে শেল পরিবেশে কনফিগারেশন পরিচালনার মাস্টার করে তুলবে:

  # ---------------------------------------------------------
  # cat cnf/qto.dev.host-name.cnf
  # [MainSection]
  # postgres_db_name     = dev_qto
  # postgres_db_host     = host-name
  #
  # call by: doParseCnfEnvVars cnf/qto.dev.host-name.cnf
  # ---------------------------------------------------------
  doParseCnfEnvVars(){

     cnf_file=$1;shift 1;
     test -z "$cnf_file" && echo " you should set the cnf_file !!!"

     INI_SECTION=MainSection

     ( set -o posix ; set ) | sort >~/vars.before

     eval `sed -e 's/[[:space:]]*\=[[:space:]]*/=/g' \
        -e 's/#.*$//' \
        -e 's/[[:space:]]*$//' \
        -e 's/^[[:space:]]*//' \
        -e "s/^\(.*\)=\([^\"']*\)$/export \1=\"\2\"/" \
        < $cnf_file \
        | sed -n -e "/^\[$INI_SECTION\]/,/^\s*\[/{/^[^#].*\=.*/p;}"`

     # and post-register for nice logging
     ( set -o posix ; set ) | sort >~/vars.after

     echo "INFO added the following vars from section: [$INI_SECTION]"
     comm -3 ~/vars.before ~/vars.after | perl -ne 's#\s+##g;print "\n $_ "'
  }
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.