রিবুট না করে কীভাবে পুনরায় লোড করবেন / ইত্যাদি / পরিবেশ?


157

/etc/environmentহয় আনুষ্ঠানিকভাবে সিস্টেম জুড়ে বিভিন্ন পরিবেশের জন্য সঠিক জায়গা। তবে আমি এই ফাইলটিতে অ্যাসাইনমেন্টগুলি পুনরায় লোড বা লগিং ছাড়াই কীভাবে পুনরায় লোড করতে পারি ?

আকর্ষণীয়ভাবে যথেষ্ট গুগল এখানে কয়েকশো ব্লগ পোস্ট ব্যবহার করার পরামর্শ দিয়ে বাদে আমাকে এখানে সহায়তা করে না

source /etc/environment

যা স্পষ্টত হবে কাজ না কারণ /etc/environmentএকটি assigments এর (প্রতি লাইনে একটি) তালিকা এবং না একটি এক্সিকিউটেবল স্ক্রিপ্ট (অত: পর নিখোঁজ exportকমান্ড /etc/environment...)।


11
সিস্টেমভিত্তিক, আমার কোনও ধারণা নেই। বর্তমান শেল সেশনের জন্য, আপনি for line in $( cat /etc/environment ) ; do export $line ; doneফাইল ফর্ম্যাটটি ব্যবহার করতে পারেন key=value
ড্যানিয়েল বেক

2
একটি ছাড়া আমার জন্য কাজ করে export...
ইজকাটা

2
@ লজকাটা: যদি কোনও ভেরিয়েবল ইতিমধ্যে রফতানি করা হয় তবে এটি আবার রফতানি করার প্রয়োজন হবে না ... যদি ইতিমধ্যে রফতানি করা হয়নি এমন নতুন ভেরিয়েবল যুক্ত করা হয় exportতবে প্রয়োজনীয় হবে ... (এটি ছাড়া এটি কেবল একটি সাধারণ অ - বর্তমান শেলের পরিবেশগত পরিবর্তনশীল, শিশু প্রক্রিয়াগুলিতে উপলভ্য নয়)
গার্ট ভ্যান ডান বার্গ

@ ড্যানিয়েলব্যাক আপনাকে ধন্যবাদ..প্লিজ উত্তর হিসাবে আপনাকে মন্তব্য যোগ করুন!
গাদেলকারিম

এটি ডেবিয়ান এবং সেন্টোগুলিতেও কাজ করে?
ম্যাসিমো

উত্তর:


122

একটি জিনিস যা সম্পর্কে আপনি ভুল করছেন তা হ'ল /etc/environmentপুনরায় লোড করার জন্য একটি রিবুট দরকার। এটি ভুল। পিএএম স্ট্যাক সক্রিয় করা হলে - কেবলমাত্র ফাইলটি পড়ার সময় লগইন করা হয় - বিশেষত pam_env.so, যা ফাইলটি পড়ে।

লগ আউট এবং পিছনে ফিরে আসা পরিবর্তনগুলি প্রয়োগ করবে - এবং আপনি যদি আপনার সমস্ত প্রক্রিয়া নতুন পরিবেশ পেতে চান তবে আপনাকে অবশ্যই এটি করতে হবে । অন্যান্য সমস্ত "সমাধান" 2 কেবলমাত্র একক শেল প্রক্রিয়াতে পরিবেশ প্রয়োগ করবে, কিন্তু নতুন টার্মিনাল উইন্ডো সহ জিইউআইয়ের মাধ্যমে আপনি যে কিছু চালু করবেন তা নয়। 1

আপনি যে সঙ্গে জরিমানা হন, তাহলে যদিও - অভাব exportকমান্ড সহ জন্য ক্ষতিপূরণ করা যেতে পারে set -aএবং set +a। যাইহোক, এটি এখনও একটি দুর্বল উপায় হিসাবে ফাইলটি কোনও উদ্ধৃতি ব্যবহার করে না। তবে এটি ভাল কাজ করা উচিত:

while read -r env; do export "$env"; done

1 জিনোম সেশন ম্যানেজার তার নিজস্ব পরিবেশ পরিবর্তন করার একটি উপায় সরবরাহ করে তবে কেবল Initializationপর্বের সময় :

$ gdbus call -e -d org.gnome.SessionManager \
                -o /org/gnome/SessionManager \
                -m org.gnome.SessionManager.Setenv \
                "FOO" "bar"
Error: GDBus.Error:org.gnome.SessionManager.NotInInitialization: Setenv
    interface is only available during the Initialization phase

2 gdb কোনও সমাধান নয়, তবে এটি কখনও কখনও ব্যবহার করা যেতে পারে। তুমি তোমার সেশন ম্যানেজার (যেমন চলমান প্রসেস এটি জোড়া আছে gnome-session), আপনার উইন্ডো ম্যানেজার (যেমন gnome-shellঅথবা openbox), আপনার টাস্কবারে / প্যানেল যদি থাকে (যেমন xfce4-panel), এবং সাধারণত অন্য কিছু সম্ভবত কাপড় চালানো হবে। এই প্রতিটি প্রক্রিয়াটির জন্য, আপনাকে gdbএটি পিআইডি দ্বারা সংযুক্ত করতে হবে, এটি putenv()ব্যবহার করে ফাংশনটি শুরু করতে হবে p, তারপরে ব্যবহার করে বিচ্ছিন্ন করুন q:

$ sudo gdb -p $(pidof gnome-session)
GNU gdb (GDB) 7.7.1
[...]
Attaching to process 718
[...]
0x00007fc2cefed81d in poll () from /usr/lib/libc.so.6

(gdb) p putenv("FOO=bar")
$1 = 0

(gdb) p putenv("BAZ=qux")
$2 = 0

(gdb) q
A debugging session is active.
Quit anyway? (y or n) y
Detaching from program: /usr/bin/gnome-session, process 718

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

এটি ছাড়াও, আপনার dbus-daemon দ্বারা ব্যবহৃত পরিবেশ আপডেট করা উচিত:

$ dbus-update-activation-environment --systemd FOO=bar BAZ=qux

পুরানো সিস্টেমগুলির জন্য:

$ gdbus call -e -d org.freedesktop.DBus \
                -o /org/freedesktop/DBus \
                -m org.freedesktop.DBus.UpdateActivationEnvironment \
                "{'FOO': 'bar', 'BAZ': 'qux'}"
()

1
Env পড়ার সময় আমি কেবল পরীক্ষা করেছি; "$ env" রফতানি করুন; উবুন্টু 16.04 এ সম্পন্ন হয়েছে এবং এটি ত্রুটিযুক্ত। আপনি কি আরও বিশদ চান?
ফ্রাঙ্ক

while readপদ্ধতি থেকে সার্চ stdin, যাতে আপনি সম্ভবত নল থেকে এটি (যেমন কিছু চান cat /etc/environment | while ...)। তবে এটি উদ্ধৃতি বিন্যাসিত পরিবেশ ফাইলগুলির সাথে কাজ করবে না ( key="value")
ভিলাসভ

6

এটি গৃহীত উত্তরের মতো বিস্তৃত নয়, তবে আপনি যদি আপনার /etc/environmentফাইলে ভেরিয়েবলগুলি উদ্ধৃত করে থাকেন তবে পূর্ববর্তী দুটি পদ্ধতি (যা export $lineকোনওরকম ব্যবহার করে ) ভুল হয়ে যায় এবং আপনি উদ্ধৃত মানগুলি দিয়ে শেষ করেন।

  • বিকল্প 1: একটি অস্থায়ী উত্স-সক্ষম ফাইল সহ

sed 's/^/export /' /etc/environment > /tmp/env.sh && source /tmp/env.sh

  • বিকল্প 2: ইনলাইন সহ for(ধন্যবাদ টিম-জোনস):

for env in $( cat /etc/environment ); do export $(echo $env | sed -e 's/"//g'); done


4
সংক্ষিপ্ত: evalsed 's/^/export /' /etc/environment
অ্যারন ম্যাকমিলিন

2
উপরের নন-টেম্পল ফাইল সংস্করণ:for env in $( cat /etc/environment ); do export $(echo $env | sed -e 's/"//g'); done
টিম জোনস

7
এমনকি খাটো: set -a; source /etc/environment; set +a;
ulidtko
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.