পরিবেশের ভেরিয়েবল সেট করার জন্য সেরা ডিস্ট্রো / শেল-অজোনস্টিক কোনটি?


31

প্রশ্ন সব বলে। আমি বর্তমানে আর্ক লিনাক্স এবং জেডএস ব্যবহার করি তবে আমি এমন একটি সমাধান চাই যা (ন্যূনতম) ভিটি এবং এক্সটারমে উভয়ই কাজ করে এবং (আশা করি, অগ্রাধিকার সহ) কাজ চালিয়ে যাবে যদি আমি ডিসট্রস বা শেলগুলি পরিবর্তন করি।

আমি বিভিন্ন ডিস্ট্রোজের ডক্সে এই প্রশ্নের বুনো dispক্যবদ্ধ উত্তর শুনেছি। উবুন্টু বলেছেন "ব্যবহার করুন .প্যাম_পরিবেশ"। আমি মনে করি আর্কে তারা যা প্রস্তাব দেয় তা আপনার শেলের উপর নির্ভর করে। বর্তমানে আমি সমস্ত কিছু প্রফাইলে রেখেছি এবং যদি কোনও শেল যদি কোনও কারণ হিসাবে উত্স না করে (উদাহরণস্বরূপ ব্যাশ .bash_profile উপস্থিত থাকে), আমি ম্যানুয়ালি এটি উত্সাহিত করে ওভাররাইড করি। তবে মনে হয় এর থেকে আরও ভাল উপায় অবশ্যই আছে।


2
এর সাথে ডিস্ট্রো এবং শেলের সাথে করার কিছুই নেই। যদিও এটি করার কোনও পোর্টেবল উপায় নেই তা নিশ্চিত নয়।
জোসেফ আর।

হুম। জট্টিল
strugee

উত্তর:


29

দুর্ভাগ্যক্রমে পরিবেশের ভেরিয়েবলগুলি সেট করার জন্য কোনও সম্পূর্ণ পোর্টেবল অবস্থান নেই। দুটি ফাইল যা নিকটে আসে সেগুলি ~/.profileহ'ল এটি theতিহ্যবাহী অবস্থান এবং অনেকগুলি সেটআপগুলিতে বাক্স থেকে বেরিয়ে আসে এবং ~/.pam_environmentএকটি আধুনিক, সাধারণ জায়গা কিন্তু সীমিত বিকল্প।

কি .োকাতে হবে ~/.pam_environment

এই ফাইলটি ~/.pam_environmentসমস্ত লগইন পদ্ধতি যা পাম ব্যবহার করে এবং এই ফাইলটি সক্ষম করে তা দ্বারা পঠিত হয় । এটি আজকাল বেশিরভাগ লিনাক্স সিস্টেমকে কভার করে।

এর প্রধান সুবিধাটি ~/.pam_environmentহ'ল (সক্ষম করা থাকলে) এটি ব্যবহারকারীর শেল শুরুর আগেই পড়া হয়, সুতরাং এটি সেশন প্রকার, লগইন শেল এবং অন্যান্য জটিলতা নির্বিশেষে কাজ করে। এটি এমনকি ইন্টারঅ্যাক্টিভ লগইন যেমন su -c somecommandএবং এর জন্যও কাজ করে ssh somecommand

এর প্রধান সীমাবদ্ধতা ~/.pam_environmentহ'ল আপনি কেবল সেখানে সরল অ্যাসাইনমেন্ট রাখতে পারবেন, জটিল শেল সিনট্যাক্স নয়। এই ফাইলটির বাক্য গঠনটি নিম্নরূপ।

  • ফাইলগুলি লাইন লাইনে পার্স করা হয়।
  • শীর্ষস্থানীয় সাদা স্থান উপেক্ষা করা হয়।
  • আপনি allyচ্ছিকভাবে লাইনগুলি exportএবং একটি একক স্থান (কোনও ট্যাব নয়, চিত্র দেখুন) শুরু করতে পারেন।
  • এর পরে, প্রতিটি লাইনে অবশ্যই ফর্ম থাকতে হবে VAR=VALUEযেখানে VAR অক্ষর, অঙ্ক এবং আন্ডারস্কোর সমন্বিত থাকে।
  • # একটি মন্তব্য শুরু করে, এটি কোনও মান হিসাবে উপস্থিত হতে পারে না।
  • যদি VALUE শুরু হয় 'বা এর সাথে "অন্যরকম অনুরূপ উদ্ধৃতি থাকে, তবে ভিএআরটি উদ্ধৃতিগুলির মধ্যে স্ট্রিংয়ে সেট করা হবে (দ্বিতীয় উদ্ধৃতিটির পরে সমস্ত কিছু উপেক্ষা করা হবে)। অন্যথায় =চিহ্নটি পরে VAR স্ট্রিংয়ে সেট করা আছে ।
  • যদি না থাকে =, পরিবেশ থেকে ভেরিয়েবল সরিয়ে ফেলা হয়।

উল্টো দিকে, ~/.pam_environmentপরিস্থিতিতে একটি বৃহত অ্যারে কাজ করে। ডাউনসাইডে, আপনার কোনও গতিশীল সেটিংস থাকতে পারে না যেমন অন্য ভেরিয়েবলের উপর একটি ভেরিয়েবলের মান ভিত্তি করে (উদাহরণস্বরূপ PATH- তে ডিরেক্টরি যুক্ত করা) বা কমান্ডের আউটপুট ব্যবহার করা যায় (উদাহরণস্বরূপ ডিরেক্টরি যদি ডিরেক্টরি বা প্রোগ্রাম উপস্থিত থাকে তবে পরীক্ষা করা) এবং কিছু অক্ষর ( #'", নিউলাইন) অসম্ভব বা ঝামেলা হয় মান রাখা।

কি .োকাতে হবে ~/.profile

এই ফাইলে পোর্টেবল (POSIX) sh সিনট্যাক্স থাকা উচিত। [[ … ]]আপনি যদি জানেন যে আপনার সিস্টেমে এই শেলগুলি রয়েছে তবে কেবলমাত্র ksh বা বাশ এক্সটেনশন (অ্যারে ইত্যাদি) ব্যবহার করুন /bin/sh

এই ফাইলটি স্বয়ংক্রিয় অ্যাপ্লিকেশনগুলিতে স্ক্রিপ্টগুলি দ্বারা পঠিত হতে পারে, সুতরাং এটি কোনও প্রোগ্রাম বা কল দেয় না যা কোনও আউটপুট বা কল উত্পাদন করে exec। আপনি যদি পাঠ্য-মোড লগইনগুলিতে এটি করতে চান তবে এটি কেবল ইন্টারেক্টিভ শেলের জন্য করুন। উদাহরণ:

case $- in *i*)
  # Display a message if I have new mail
  if mail -e; then echo 'You have new mail'; fi
  # If zsh is available, and this looks like a text-mode login, run zsh
  case "`ps $PPID` " in
    *" login "*)
      if type zsh >/dev/null 2>/dev/null; then exec zsh; fi;;
  esac
esac

এটি /bin/shআপনার লগইন শেল হিসাবে ব্যবহার এবং আপনার প্রিয় শেলটিতে স্যুইচ করার উদাহরণ an আরও দেখুন আমি যখন আমার sysadmin আমাকে পরিবর্তন করা যাক করতে রাজি আমার লগ-ইন শেল হিসাবে ব্যাশ ব্যবহার করতে পারেন

~/.profileঅ-গ্রাফিকাল লগইনে কখন পড়া হয় না?

বিভিন্ন লগইন শেল বিভিন্ন ফাইল পড়ে।

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

বাশ পড়েন ~/.bash_loginবা ~/.bash_profileতাদের পরিবর্তে উপস্থিত থাকলে ~/.profile। এছাড়াও ব্যাশটি ~/.bashrcইন্টারেক্টিভ হলেও লগইন শেলটিতে পড়ে না। এই quirks আবার মনে রাখতে হবে না, ~/.bash_profileনিম্নলিখিত দুটি লাইন দিয়ে একটি তৈরি করুন :

. ~/.profile
case $- in *i*) . ~/.bashrc;; esac

এছাড়াও দেখুন ব্যাশ সহ পরিবেশের ভেরিয়েবল সেটআপ করার জন্য কোন সেটআপ ফাইলগুলি ব্যবহার করা উচিত?

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

Zsh পড়া ~/.zprofileএবং ~/.zloginনা, কিন্তু ~/.profile। Zsh এর sh থেকে আলাদা সিনট্যাক্স রয়েছে তবে ~/.profilesh এমুলেশন মোডে পড়তে পারেন । আপনি এটি আপনার জন্য ব্যবহার করতে পারেন ~/.zprofile:

emulate sh -c '. ~/.profile'

এছাড়াও দেখুন জেডএস ~ /। প্রোফাইলগুলিতে আঘাত করছে না

যদি আপনার লগইন শেলটি অন্য কোনও শেল হয়

/bin/shআপনার লগইন শেল এবং আপনার পছন্দের শেল (যেমন মাছ) কেবলমাত্র একটি ইন্টারেক্টিভ শেল হিসাবে ব্যবহারের অভাব সেখানে আপনি তেমন কিছু করতে পারবেন না । আমি zsh সঙ্গে কি কি। থেকে অন্য শেলটি চাওয়ার উদাহরণের জন্য উপরে দেখুন ~/.profile

রিমোট কমান্ড

ইন্টারেক্টিভ শেলটি ছাড়াই কোনও রিমোট কমান্ডের আবেদন করার সময়, সমস্ত শেল একটি স্টার্টআপ ফাইলটি পড়ে না।

Ksh ENVভেরিয়েবল দ্বারা নির্দিষ্ট ফাইলটি পড়ে , যদি আপনি এটি পাস করার ব্যবস্থা করেন manage

বাশ পড়েন ~/.bashrcযদি এটি ইন্টারেক্টিভ না হয় (!) এবং এর মূল প্রক্রিয়াটি বলা হয় rshdবা sshd। সুতরাং আপনি আপনার ~/.bashrcদিয়ে শুরু করতে পারেন

if [[ $- != *i* ]]; then
  . ~/.profile
  return
fi

~/.zshenvশুরু হওয়ার সাথে সাথে Zsh সর্বদা পড়ে । সাবধানতার সাথে ব্যবহার করুন, যেহেতু এটি zsh এর প্রতিটি একক উদাহরণ দ্বারা পঠিত হয়, এমনকি এটি যখন আপনি অন্য ভেরিয়েবলগুলি সেট করে থাকেন সেখানেও এটি একটি সাবশেল is Zsh যদি আপনার লগইন শেল হয় এবং আপনি কেবল এটি দূরবর্তী কমান্ডগুলির জন্য ভেরিয়েবল সেট করতে ব্যবহার করতে চান, একজন প্রহরী ব্যবহার করুন: কিছু ভেরিয়েবল সেট করুন ~/.profile, যেমন MY_ENVIRONMENT_HAS_BEEN_SET=yesপড়ার আগে এই গার্ডটি পরীক্ষা করুন ~/.profile

if [[ -z $MY_ENVIRONMENT_HAS_BEEN_SET ]]; then emulate sh -c '~/.profile'; fi

গ্রাফিকাল লগইনের ক্ষেত্রে

অনেকগুলি ডিস্ট্রিবিউশন, ডিসপ্লে ম্যানেজার এবং ডেস্কটপ এনভায়রনমেন্টগুলি ~/.profileস্টার্টআপ স্ক্রিপ্টগুলি থেকে স্পষ্টভাবে সোর্স করে বা লগইন শেল চালিয়ে চালানোর ব্যবস্থা করে।

দুর্ভাগ্যক্রমে, ডিস্ট্রো / ডিএম / ডিই সংমিশ্রণগুলি হ্যান্ডল করার কোনও সাধারণ পদ্ধতি নেই যেখানে ~/.profileপড়া হয় না।

আপনি যদি শুরু করে একটি traditionalতিহ্যবাহী অধিবেশন ব্যবহার করেন তবে ~/.xsessionএটি সেই জায়গা যেখানে আপনার পরিবেশের পরিবর্তনশীলগুলি সেট করা উচিত; এটি সোর্সিং দ্বারা ~/.profile(অর্থাত্ . ~/.profile) করুন। মনে রাখবেন যে কয়েকটি সেটআপে, ডেস্কটপ এনভায়রনমেন্ট স্টার্টআপ স্ক্রিপ্টগুলি ~/.profileআবার উত্স করবে ।


কি করে case $- in *i*)?
কোডেনিনজা

2
@qodeninja executes নিম্নলিখিত নির্দেশাবলী (ম্যাচিং পর্যন্ত ;;বা esac) যদি $-ম্যাচ প্যাটার্ন *i*, অর্থাত্ যদি $-রয়েছে i, অর্থাত্ শেল ইন্টারঅ্যাকটিভ পারেন।
গিলস 'অসন্তুষ্ট হওয়া বন্ধ করুন'

$-বর্তমানে সেট করা শেল বিকল্পগুলির একটি স্ট্রিং। (মত set -x) iমানে ইন্টারেক্টিভ শেল।
পিটার কর্ডেস

~/.config/envএমনকি আপনি অনুকরণ ছাড়াই কেবল একটি সাধারণ ফাইল উত্স তৈরি করতে পারবেন না ?
কেভিন সটল 21

1
@ স্টাফেনচেজেলাস এটি একটি পিউরিস্ট দৃষ্টিভঙ্গি। আমি .profileবেশ পুরানো বোর্ন শেলগুলির সাথে আমার আনুষঙ্গিক রাখি , তবে আমি স্বীকার করেছি যে কিছু লোকের কেবল যত্ন নেই। লোকেরা নিজের ফাইলগুলির জন্য sh = বাশ ধরে ধরে আমার বিরুদ্ধে কিছু নেই, কেবলমাত্র তারা যত্নশীল #!/bin/shস্ক্রিপ্ট প্রকাশ করে তবেই আমি যত্নশীল ।
গিলস 'অশুভ হওয়া বন্ধ করুন'

4

যতদূর আমি জানি যে পরিবেশের ভেরিয়েবলগুলি কীভাবে সেট করা যায় তার কোনও ডিস্ট্রো এবং শেল অজ্ঞাব্য মানক নেই।

সর্বাধিক সাধারণ এবং ডি ফ্যাক্টো স্ট্যান্ডার্ডটি মনে হয় /etc/profileএবং ~/.profile। দ্বিতীয়টি সবচেয়ে সাধারণ বলে মনে হয় /etc/environmentএবং ~/.pam_environment

আমার কাছে মনে হয় যে সমস্ত নথি যা আমি পেয়েছি তা ইতিমধ্যে খুঁজে পেয়েছি। আমি অন্য পাঠকদের জন্য এগুলি এখানে তালিকাবদ্ধ করি।

  • দেবিয়ান সুপারিশ করে /etc/profileএবং ~/.profile( লিঙ্ক )।
  • উবুন্টু প্রস্তাব দেয় /etc/environmentএবং ~/.pam_environment( লিঙ্ক )।
  • আর্ক লিনাক্স উল্লেখ করেছে, অন্যদের মধ্যে /etc/profileএবং /etc/environment( লিঙ্ক )।

বোনাস: একটি পাঠ্য /etc/environmentযা ডেবিয়ানে ব্যবহার এবং / অথবা এর অপব্যবহার সম্পর্কে প্রশ্নবিদ্ধ ( লিঙ্ক , শেষ আপডেট ২০০ 2008)।


আপনি যে ফাইলই ব্যবহার করুন না কেন আপনি এখনও বিভিন্ন শেলের মধ্যে বেমানান সিনট্যাক্সে ঝাঁপিয়ে পড়বেন।
জোসেফ আর।

1
@JosephR। বেশিরভাগ শেলগুলি পিছনের দিকে সামঞ্জস্য রাখে না sh? এতক্ষণ আপনি
পসিক্সের সাথে লেগে

1
আফাইক আপনি পোজিক্স ওয়েতে ভেরিয়েবল cshএবং বন্ধুদের বরাদ্দ করতে পারবেন না (আপনার মতো কিছু দরকার setবা হোক setenv)
জোসেফ আর

0

আমি নিম্নলিখিত স্ক্রিপ্ট added / বিন / অগ্নিস্টিক_সেটেনভ যুক্ত করেছি:

#!/bin/csh -f
set args = ($*)
if ($#args == 1) then
   echo "export $args[1]="
   exit 0
endif

if ($#args == 2) then
   if ("$args[1]" =~ *csh*) then 
      echo "setenv $args[2]"
      exit 0
   else
      echo "export $args[1]=$args[2]"
      exit 0
   endif
endif

echo "setenv $args[2] $args[3]"

এবং ~ / .perl-homedir এ আমি ব্যবহার করি:

eval `${HOME}/bin/agnostic_setenv $shell PERL_HOMEDIR 0`

অ্যাগনস্টিক_উন্সেটেনভের জন্য একটি সিম্প্রিপ্ট স্ক্রিপ্ট:

#!/bin/csh -f
set args = ($*)
if ($#args == 1) then
   echo "export $args[1]"
   exit 0
endif

echo "unsetenv $args[2]"
exit 0
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.