পরিবেশের পরিবর্তনশীল কোথা থেকে এসেছে তা কীভাবে নির্ধারণ করবেন?


153

আমার একটি লিনাক্স উদাহরণ রয়েছে যা আমি কিছুক্ষণ আগে সেট আপ করেছি। আমি যখন এটি জ্বালিয়ে ফেলি এবং লগ ইন করি যেহেতু rootকিছু পরিবেশের পরিবর্তনশীল রয়েছে যা আমি সেট আপ করেছিলাম তবে সেগুলি কোথা থেকে এসেছে তা আমি মনে করতে পারি না বা খুঁজে পাই না।

  • আমি চেক করেছি ~/.bash_profile, /etc/.bash_rcএবং সমস্ত সূচনার স্ক্রিপ্ট।
  • আমি দৌড়েছি findএবং grepকোন লাভ হয়নি।

আমার মনে হচ্ছে আমি অবশ্যই কোনও জায়গায় স্পষ্ট করে দেখতে ভুলে যাচ্ছি। এটি বের করার কোনও কৌশল আছে কি?


6
/etc/environmentঅন্য এক।
ডার্বোবার্ট

8
এবং /etc/env.d/*ফাইল। তবে grep -R "YOUR_VARIABLE" /etc/করা সম্ভবত এটির সর্বাধিক উপায়।
rozcietrzewiacz


@ জর্জিট্রেজেভিয়াক্জ সবচেয়ে সহজ উপায় ... যদি ভেরিয়েবলটি সত্যিই / ইত্যাদি / এর অধীনে কোথাও অবস্থিত থাকে (যেমন আমার ক্ষেত্রে); আপনি যদি এটি উত্তর হিসাবে পোস্ট করেন তবে আমি উপচে পড়ব;)
লাইন

উত্তর:


55

আপনি যদি envভেরিয়েবলগুলি প্রদর্শনের জন্য কমান্ডটি ব্যবহার করেন তবে সেগুলি তৈরির ক্রমে মোটামুটিভাবে দেখা উচিত। সেগুলি বুটের খুব প্রথম দিকে সিস্টেম দ্বারা নির্ধারিত অথবা পরবর্তীকালে প্রোফাইলে বা অন্যান্য কনফিগারেশন ফাইল দ্বারা সেট করা থাকলে আপনি এটি গাইড হিসাবে ব্যবহার করতে পারেন। আমার অভিজ্ঞতা অনুসারে, setএবং exportকমান্ডগুলি বর্ণের ক্রম অনুসারে তাদের পরিবর্তনগুলি বাছাই করবে, যাতে তালিকাটি তেমন কার্যকর হয় না।


1
এটি দুর্দান্ত ... আমি পরিবেশের পরিবর্তনশীল (/ etc / এনভায়রনমেন্টে সেট করা) কী পরিষ্কার করছি তা জানার চেষ্টা করছি except :-) (এবং হ্যাঁ, এটি প্রাথমিকভাবে সেট করা হচ্ছে ... লগইন করার জন্য আমি
বিভিন্নগুলিতে

127

যদি zshআপনার লগইন শেল হয়:

zsh -xl

সাথে bash:

PS4='+$BASH_SOURCE> ' BASH_XTRACEFD=7 bash -xl 7>&2

এটি একটি লগইন শেল অনুকরণ করে এবং zshবর্তমানে যা করা হচ্ছে তার নামের পাশাপাশি ফাইলটির নাম সহ স্টেডার পুনঃনির্দেশিত ক্ষেত্রগুলি বাদে যা কিছু করা হয়েছে তা প্রদর্শন করবে ।

সুতরাং আপনাকে যা করতে হবে তা হ'ল আউটপুটে আপনার পরিবেশের পরিবর্তনশীলের নাম অনুসন্ধান করা। (আপনি ব্যবহার করতে পারেন scriptআপনি পুরো শেল অধিবেশন আউটপুট সংরক্ষণ সাহায্য করার জন্য কমান্ড বা bashপদ্ধতির ব্যবহার 7> file.logপরিবর্তে 7>&2সঞ্চয় করতে xtraceআউটপুট file.logপরিবর্তে টার্মিন্যালে)।

যদি আপনার ভেরিয়েবলটি সেখানে না থাকে, তবে সম্ভবত শেলটি এটি সূচনাতে উত্তরাধিকার সূত্রে প্রাপ্ত হয়েছিল, সুতরাং এটি পাম কনফিগারেশনের মতো আগে সেট করা হয়েছিল ~/.ssh/environment, বা আপনার এক্স 11 সেশন প্রারম্ভকালে ( ~/.xinitrc, ~/.xsession) বা আপনার লগইন শুরু হওয়া পরিষেবা সংজ্ঞা অনুসারে সেট করা হয়েছিল ম্যানেজার বা এমনকি কিছু বুট স্ক্রিপ্টে। তারপরে একটি find /etc -type f -exec grep -F THE_VAR {} +সাহায্য করতে পারে।


4
চিত্তাকর্ষক এবং সহায়ক, আপনাকে ধন্যবাদ। আমাদের জন্য n00bs, আপনি কি মোড সম্পর্কে কিছুটা আরও ব্যাখ্যা করবেন এবং আমরা কীভাবে মোড থেকে বেরিয়ে যাব এটি আমাদের রাখে? উদাহরণস্বরূপ, আমরা কেবল এই আউটপুটটিকে গ্রেপ করতে পাই না।
জেফ্রি হেল

5
@ জিফ্রেহেল আপনি যদি স্টারডার zsh -xl 2>&1এবং স্টাডআউট আউটপুটগুলিকে একীভূত করেন তবে আপনি যথারীতি গ্রেপ করতে পারেন।
রাকেশ

1
fishশেল দিয়ে এটি করার কোনও উপায় আছে ?
নিক মিষ্টি

এমনকি যদি আমি ব্যবহার করি তবে zsh -xl 2>&1কোনওভাবে আমি সাধারণত গ্রেপ করতে পারি না। স্পষ্টতই আউটপুটটিতে সঠিকভাবে নতুন নিউলাইন বা কিছু থাকে না।
জেরুস

আমি মনে করি আপনি কেবল ব্যবহার করতে পারবেন PS4='+$BASH_SOURCE> ' BASH_XTRACEFD=7 bash -xl 7>/tmp/$(uuidgen), তারপরে সেই এলোমেলো ফাইলটিতে গ্রেপ করুন।
বিডি 1251252

50

প্রথম দেখার জন্য কয়েকটি জায়গা:

সিস্টেম প্রশস্ত

  • /etc/environment: বিশেষত পরিবেশের পরিবর্তনশীলগুলির জন্য বোঝানো হয়
  • /etc/env.d/*: পরিবেশের ভেরিয়েবল, একাধিক ফাইলে বিভক্ত
  • /etc/profile: সমস্ত প্রারম্ভিক স্ক্রিপ্ট
  • /etc/profile.d/*: সূচনা স্ক্রিপ্ট
  • /etc/bashrc, /etc/bash.bashrc: ফাংশন এবং উপাধি জন্য বোঝানো

ব্যবহারকারী নির্দিষ্ট

  • ~/.bash_profile: লগইন (বাশ-) শেলগুলির জন্য আরম্ভকরণ
  • ~/.bashrc: সমস্ত ইন্টারেক্টিভ (বাশ-) শেলগুলির জন্য আরম্ভকরণ
  • ~/.profile: সমস্ত শেল জন্য ব্যবহৃত
  • ~/.cshrc, ~/.zshrc, ~/.tcshrc: অ ব্যাশ শেল জন্য অনুরূপ

31

@ সিয়ান সঠিক ব্যবহার ছাড়াও findএবং grepসেখানে না আপনাকে অনেক আবিষ্কার যেখান থেকে এটা এসেছে করতে পারেন। এটি প্রকৃতপক্ষে একটি পরিবেশে পরিবর্তনশীল, এই জেনে আমি আপনার অনুসন্ধান / / ইত্যাদি / এবং আপনার হোম ডিরেক্টরিতে ফোকাস করার চেষ্টা করব। VARIABLEআপনি যে উপযুক্ত ভেরিয়েবলটি অনুসন্ধান করছেন তা প্রতিস্থাপন করুন :

$ grep -r VARIABLE /etc/*

$ grep -r VARIABLE ~/.*


1
অবাক করা বিষয় যে একটি উত্তর যা 'হ্যাঁ আপনি পারবেন' বলার সাথে ঘিরে 'আপনি পারবেন না' বলে জবাব দেয়, এমনকি এর অনেকগুলি উত্সাহও রয়েছে।
মাইকেল শ্যাপার 2

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

এই জিনিস আমার সময় সমাধান। ধন্যবাদ।
হাসান রাজা 10

@ মিশেলশেপার "আপনি" এটি "সন্ধান / গ্রেপ ছাড়াই করতে পারবেন না"। পরে "আপনি করতে পারেন" এ এটি কীভাবে করা যায় তা বর্ণিত হয়েছে
লাইন

23

আপনি করা যদি set -xআপনার .profileবা .bash_profile, সমস্ত পরবর্তী শেল কমান্ড মান ত্রুটি লগ করা হবে এবং আপনি দেখতে পারেন যদি তাদের মধ্যে একজন এই ভেরিয়েবল সেট করে। এটি ট্রেস করার set -xজন্য /etc/profileআপনি শীর্ষে রাখতে পারেন । আউটপুটটি খুব ভার্বোজ হতে পারে, তাই আপনি এ জাতীয় কিছু দিয়ে কোনও ফাইলে পুনর্নির্দেশ করতে চাইতে পারেন exec 2>/tmp/profile.log

যদি আপনার সিস্টেমটি প্যাম ব্যবহার করে তবে pam_envলোডের জন্য অনুরোধগুলি সন্ধান করুন /etc/pam.confবা /etc/pam.d/*। এই মডিউলটি নির্দিষ্ট ফাইলগুলি থেকে, বা কোনও ফাইল নির্দিষ্ট না করা থাকলে সিস্টেম ডিফল্ট থেকে ( /etc/environmentএবং /etc/security/pam_env.confডেবিয়ান এবং উবুন্টুতে) পরিবেশের ভেরিয়েবলগুলি লোড করে s লিনাক্সের এনভায়রনমেন্ট ভেরিয়েবল সংজ্ঞা সহ অন্য একটি ফাইল হ'ল /etc/login.defs(শুরু হওয়া লাইনের সন্ধান করুন ENV_)।


5

তারা সূত্র .(ডট) বা ব্যবহার করে উত্সযুক্ত ফাইলগুলির জন্য আপনার প্রারম্ভিক স্ক্রিপ্টগুলি পরীক্ষা করুন source। এই ফাইলগুলি অন্য ডিরেক্টরিতে /etcএবং ছাড়াও হতে পারে $HOME


2

জন্য zshব্যবহারকারী, ফাইল যে (সূচনার সময়) ব্যবহার করা হয় উপযোগী হতে পারে ট্রেসিং, তারা না তোমার সঙ্গে অনেক বেশী এবং এক তাদের মাধ্যমে সন্ধান করতে পারেন এক-বাই-এক যেখানে কিছু সংজ্ঞায়িত করা হয় খুঁজে পেতে।

zsh -o SOURCE_TRACE

0

এনভায়রনমেন্ট ভেরিয়েবলগুলি / ইত্যাদি / প্রোফাইল ফাইলে সংরক্ষণ করা হয় তাই আরও / ইত্যাদি / প্রোফাইলে কাজ করুন এবং আপনার পছন্দসই এনভির ভেরিয়েবলগুলি পরীক্ষা করুন এবং / ইত্যাদি / প্রোফাইল উপস্থিত না থাকলে আপনার হোম ডিরেক্টরিতে। প্রোফাইল ফাইলের জন্য লক করুন


1
পরিবেশ ভেরিয়েবল না সংরক্ষণ করা /etc/profile, আপনি তাদের সেখানে সিস্টেম জুড়ে যেমন জন্য বর্ণনা করতে পারেন bashযখন লগ-ইন শেল হিসাবে ব্যবহার। ফাইল এবং / অথবা কমান্ডলাইন থেকে সংজ্ঞা পড়ার পরে এগুলি শেল প্রক্রিয়া দ্বারা সংরক্ষণ করা হয়।
অ্যান্থন

-2

উদাহরণস্বরূপ, আপনি যদি HISTFILE ভেরিয়েবল এবং এর মান সন্ধান করতে চান বা ইতিহাস সম্পর্কে কোন ভেরিয়েবল সংজ্ঞায়িত হয় তা জানতে চান তবে আপনি এটি শেলটিতে টাইপ করবেন:

set | grep HIST
env | grep HIST
printenv | grep HIST

যদি আপনি ইতিমধ্যে নাম জানতে, কেন না: echo "$HISTFILE"?
জেফ স্ক্যালার হলেন

কারণ, আমরা খুঁজে পেতে চাই যেখানে F HISTFILE ভেরিয়েবল সংজ্ঞায়িত হয়েছে। এছাড়াও যদি আমি জানতে চাই না যে কোন পরিবর্তনশীলগুলি আবু ইতিহাসের সংজ্ঞা দেওয়া হয়
Vusal Aliyev

2
দুর্ভাগ্যক্রমে, setকোন ফাইলটি ভেরিয়েবল সংজ্ঞায়িত করে তা আপনাকে জানায় না।
জেফ শ্যাচলার
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.