সমস্ত সাব শেলগুলিতে উপলভ্য হতে একটি এনভিভি ভেরিয়েবল রফতানি করুন, এবং সংশোধন করা সম্ভব?


22

ধরুন আমার আছে

export MY_VAR=0

মধ্যে ~/.bashrc

আমি একজন GNOME টার্মিনাল খুলেছেন, এবং এই টার্মিনাল, আমি পরিবর্তনে $MY_VARমান 200। সুতরাং, আমি যদি না

echo $MY_VAR

এই টার্মিনালে 200প্রদর্শিত হয়।

এখন, আমি আমার জিনোম টার্মিনালে একটি অন্য ট্যাব খুললাম, এবং করব

echo $MY_VAR

... এবং পরিবর্তে 200, আমার আছে 0

টার্মিনালটি যখন পরিবেশের পরিবর্তনশীল পরিবর্তন করে, এই পরিবর্তনটি (200 এ সেট করে) পরবর্তী সমস্ত সাব শেল এবং এর জন্য উপলভ্য করে তখন আমি 200 মান ধরে রাখতে কী করব? এটা কি সম্ভব?

উত্তর:


23

পরিবেশের একটি অনুলিপি সাব-শেলগুলিতে প্রচার করে, তাই এটি কাজ করে:

$ export MY_VAR=200
$ bash
$ echo $MY_VAR
200

তবে এটি যেহেতু এটি অনুলিপি, তাই আপনি সেই মানটি প্যারেন্ট শেল পর্যন্ত পেতে পারবেন না - কমপক্ষে পরিবেশ পরিবর্তন করে নয়।

মনে হচ্ছে আপনি প্রকৃতপক্ষে আরও এক ধাপ এগিয়ে যেতে চান, যা এমন কিছু তৈরি করা যা যা গ্লোবাল ভেরিয়েবলের মতো কাজ করে, পিতামাতার কাছ থেকে আলাদাভাবে শুরু করা "ভাইবোন" শেলগুলি ভাগ করে - জিনোম টার্মিনালে আপনার নতুন ট্যাবের মতো।

বেশিরভাগ ক্ষেত্রে, উত্তরটি "আপনি পারবেন না, কারণ পরিবেশের ভেরিয়েবলগুলি সেভাবে কাজ করে না"। তবে, এর আরও একটি উত্তর রয়েছে যা হ'ল আপনি সর্বদা কিছু হ্যাক করতে পারেন। একটি পদ্ধতি হ'ল ফাইলের মতো ভেরিয়েবলের মান লিখুন ~/.myvarএবং তারপরে এটি অন্তর্ভুক্ত করুন ~/.bashrc। তারপরে, প্রতিটি নতুন শেল সেই ফাইল থেকে পঠিত মান দিয়ে শুরু হবে ।

আপনি আরও একধাপ এগিয়ে যেতে পারেন - ~/.myvarবিন্যাসে তৈরি করুন MYVAR=200এবং তারপরে সেট করুন PROMPT_COMMAND=source ~/.myvar, যার ফলে প্রতিবার নতুন প্রম্পট পাওয়ার সাথে সাথে মানটি পুনরায় পড়তে হবে। এটা এখনও নেই বেশ একটি ভাগ বিশ্বব্যাপী পরিবর্তনশীল, কিন্তু এটা এটা পছন্দ কাজ করতে শুরু করছে চারপাশ। কোনও প্রম্পট ফিরে না আসা পর্যন্ত এটি সক্রিয় হবে না, যদিও আপনি যা করার চেষ্টা করছেন তার উপর নির্ভর করে এটি একটি গুরুতর সীমাবদ্ধতা হতে পারে।

এবং তারপরে অবশ্যই পরবর্তী জিনিসটি স্বয়ংক্রিয়ভাবে পরিবর্তনগুলি লিখতে হবে ~/.myvar। এটি কিছুটা জটিল হয়ে ওঠে এবং আমি এই মুহুর্তে থামব, কারণ সত্যিকার অর্থে পরিবেশের ভেরিয়েবলগুলি আন্তঃ শেল যোগাযোগ ব্যবস্থা নয়, এবং এটি করার জন্য আরও একটি উপায় খুঁজে পাওয়া আরও ভাল।


10
আমি নির্যাতনের নীচে শেলটি

হ্যাঁ দুঃখিত সে কারণেই আমি থামলাম। :)
ম্যাচটিএম

"যা হ'ল এমন কিছু তৈরি যা যা বিশ্বব্যাপী ভেরিয়েবলের মতো কাজ করে" - ওয়েল, সত্যই, আমি এটি সম্পাদন করার চেষ্টা করছিলাম। ~ / .Myvar সুন্দর নয়, তবে এটি কার্যকর। আপনার আরেকটি পরামর্শ আছে?
এখনও কেউ আপনাকে এমএস-ডস

2
ঠিক আছে, কিছুটা পিছিয়ে যাক। আপনি কেন বিশ্বব্যাপী পরিবর্তনশীল চান?
ম্যাচটিএম

1
@ মেট্টেম: আমার কিছু "আমলা" রয়েছে যা আমাকে মানতে হবে। তার মধ্যে একটি কোডের একটি গুচ্ছ যা আমার একটি মন্তব্য সহ প্রতিশ্রুতিবদ্ধ হওয়া দরকার। এই কোডগুলি এখন একটি ফোল্ডারের শ্রেণিবদ্ধ (হোম / ইউজার / প্রজেক্টস / প্রজেক্টকোড / কোড 1 / কোড 2)। আমি একটি ফাংশন তৈরি করেছি যা কোড 1 এবং কোড 2 কে এনভ ভার্সে বের করে (সুতরাং যখন আমার কোনও ক্রিয়াকলাপ করা দরকার তখন আমি কোডগুলির সাথে ডিরের ভিতরে ফাংশনটি কল করি), এবং সেগুলি যখন কমিট করে আমি ভিএম ব্যবহার করি এবং কিছু ফাংশন রয়েছে যা এই vars পড়ুন এবং একটি মন্তব্য স্বয়ংক্রিয়ভাবে করা। আমি মনে করি এটির জন্য ফাইলগুলি ব্যবহার করা একটি সমাধান হতে পারে।
এখনও কেউ আপনাকে এমএস-ডস

13

ধরুন আমি export MY_VAR=0~/.bashrc

এটি আপনার ভুল এখনই। আপনি আপনার পরিবেশের পরিবর্তনশীলগুলিকে এতে সংজ্ঞায়িত করতে হবে ~/.profile, যা আপনি লগ ইন করার ~/.bashrcসময় পড়া হয় a আপনি যখন অভ্যন্তরীণ শেলটি শুরু করেন, এটি ওভাররাইড করে MY_VAR। আপনি যদি এটি না করে থাকেন তবে আপনার পরিবেশ পরিবর্তনশীল নীচের দিকে প্রচার করবে।

আরও তথ্যের জন্য ~/.bashrcবনাম ~/.profileআমার দেখতে পূর্ববর্তী পোস্ট উপর এই বিষয়ে

নোট করুন যে wardর্ধ্বমুখী প্রচার (প্যারেন্ট শেলের মধ্যে স্বয়ংক্রিয়ভাবে প্রতিফলিত সাব-শেল থেকে একটি পরিবর্তিত মান পাওয়া) সম্ভব নয়, পুরো স্টপ।



3

পরিবেশের ভেরিয়েবল মোটেও ব্যবহার করবেন না। ফাইল ব্যবহার করুন।

ফাইল আপডেট / পড়ার সময় একে অপরের দিকে পদক্ষেপ নেওয়া থেকে বিরত রাখতে লকফিল এবং ছোট ফ্রন্ট-এন্ড আপডেটার স্ক্রিপ্টগুলি ব্যবহার করুন যার উদ্দেশ্য কেবল কোনও ফাইল লক না করা থাকলে $ 1 দিয়ে আপডেট করা। লকফিলগুলি মূলত কোনও নির্দিষ্ট ফাইল (/var/run/yourscript.lck) উপস্থিত রয়েছে কিনা তা পরীক্ষা করে প্রয়োগ করা হয় এবং যদি তা হয় তবে কিছুক্ষণের জন্য ফাইলটি অদৃশ্য হওয়ার জন্য অপেক্ষা করুন, এবং যদি তা না ঘটে তবে ব্যর্থ হন। ফাইল আপডেট করার পরে আপনাকে অবশ্যই লকফিলটি মুছতে হবে।

কোনও পরিস্থিতি পরিচালনা করতে প্রস্তুত থাকুন যেখানে কোনও স্ক্রিপ্ট কোনও ফাইল আপডেট করতে পারে না কারণ ফাইলটি ব্যস্ত busy


8
একটি কৌশল: লক করার জন্য ফাইলগুলির পরিবর্তে ডিরেক্টরিগুলি ব্যবহার করুন কারণ mkdirএকটি পারমাণবিক পরীক্ষা-তৈরি এবং তৈরি হিসাবে কাজ করে।
mattdm

1
যদি আপনি ছেলেরা লক করার বিষয়ে কথা বলতে চান, তবে আপনি সম্ভবত এটি ব্যবহার করতে পারেনflock(2)
এহতেশ চৌধুরী

@mattdm আমি দেখেছি যে একটি সিমিলিংক ln -s dummy lockfile(ভাঙ্গা হলেও) খুব বেশি কাজ করতে পারে কারণ এটি যদি সিমলিংকটি ইতিমধ্যে বিদ্যমান থাকে তবে এটি ব্যর্থ হবে। আমি সত্যিই 100% সুরক্ষিত কিনা তা পরীক্ষা করার কোনও উপায় অবাক করি।
অ্যাকোরিয়াস পাওয়ার

1

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

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

এবং আমি ঠিক এই নকশাটির বাস্তবায়নও পেয়েছি ... তবে এটি পার্লে রয়েছে।

সম্ভাব্য সমাধান হিসাবে যেভাবেই এই উত্তর যুক্ত করা হচ্ছে।

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