পরিবেশগত পরিবর্তনসমূহ বনাম অবস্থানগত পরামিতি
$INTEGERভেরিয়েবলের ধরণের বিষয়ে আলোচনা শুরু করার আগে আমাদের বুঝতে হবে সেগুলি আসলে কী এবং কীভাবে তারা পরিবেশের ভেরিয়েবল থেকে পৃথক V ভেরিয়েবলগুলি যেমন $INTEGERঅবস্থানিক পরামিতি বলে। এটি POSIX (পোর্টেবল অপারেটিং সিস্টেম ইন্টারফেস) স্ট্যান্ডার্ড, বিভাগ 2.1 (জোর দিয়ে খনি) - এ বর্ণনা করা হয়েছে:
- শেলটি একটি ফাংশন সম্পাদন করে (ফাংশন সংজ্ঞা কমান্ড দেখুন), অন্তর্নির্মিত (বিশেষ বিল্ট-ইন ইউটিলিটিগুলি দেখুন), এক্সিকিউটেবল ফাইল, বা স্ক্রিপ্ট, আর্গুমেন্টের নাম দিয়ে 1 থেকে n নম্বরযুক্ত পজিশনাল প্যারামিটার হিসাবে এবং কমান্ডের নাম (অথবা কোনও স্ক্রিপ্টের মধ্যে কোনও ক্রিয়াকলাপের ক্ষেত্রে, স্ক্রিপ্টের নাম) সংখ্যাযুক্ত 0 হিসাবে প্যারামিটার হিসাবে চিহ্নিত হয় (কমান্ড অনুসন্ধান এবং সম্পাদন দেখুন)।
বিপরীতে, যেমন ভেরিয়েবল $HOMEএবং $PATHবিভিন্ন পরিবেশের হয়। তাদের সংজ্ঞাটি স্ট্যান্ডার্ডের 8 অনুচ্ছেদে বর্ণিত হয়েছে :
এই অধ্যায়ে বর্ণিত পরিবেশ পরিবর্তনশীল একাধিক ইউটিলিটি, ফাংশন এবং অ্যাপ্লিকেশনগুলির ক্রিয়াকলাপকে প্রভাবিত করে। অন্যান্য পরিবেশের পরিবর্তনশীল রয়েছে যা কেবলমাত্র নির্দিষ্ট ইউটিলিটিগুলির জন্যই আগ্রহী। পরিবেশগত ভেরিয়েবলগুলি যা কেবল একটি একক ইউটিলিটিতে প্রযোজ্য সেগুলি ইউটিলিটি বর্ণনার অংশ হিসাবে সংজ্ঞায়িত করা হয়।
তাদের বিবরণ লক্ষ্য করুন। অবস্থানগত পরামিতি বলতে একটি কমান্ডের সামনে উপস্থিত হওয়া বোঝায়, অর্থাত্ command positional_arg_1 positional_arg_2...। এগুলি ব্যবহারকারীর দ্বারা বিশেষত কী করা উচিত তা কমান্ডটি জানাতে সরবরাহ করা হয়েছিল। আপনি যখন করবেন echo 'Hello' 'World', এটি স্ট্রিংগুলি Helloএবং Worldমুদ্রণগুলি প্রিন্ট করবে , কারণ এগুলি হল অবস্থানগত পরামিতি echo- আপনি যে জিনিসগুলিতে echoপরিচালনা করতে চান । এবং echoএটি এমনভাবে তৈরি করা হয়েছে যে এটি অবস্থানীয় পরামিতিগুলি স্ট্রিংগুলি মুদ্রণের জন্য হিসাবে বোঝে (যদি না তারা পছন্দসই পতাকাগুলির মধ্যে না হয় -n)। আপনি যদি আলাদা কমান্ড দিয়ে এটি করেন তবে এটি কী Helloএবং কী তা বুঝতে পারে নাWorldসম্ভবত এটি একটি সংখ্যা প্রত্যাশা কারণ। লক্ষ্য করুন যে অবস্থানগত পরামিতিগুলি "উত্তরাধিকার সূত্রে প্রাপ্ত নয়" - কোনও শিশু প্রক্রিয়া সুস্পষ্টভাবে শিশু প্রক্রিয়াতে না পৌঁছে দেওয়া পর্যন্ত পিতামাতার অবস্থানগত পরামিতিগুলি সম্পর্কে জানে না। প্রায়শই আপনি দেখেন যে মোড়ক স্ক্রিপ্টগুলির সাথে অবস্থানগত পরামিতিগুলি পাস করা হচ্ছে - এটি সম্ভবত কমান্ডের ইতিমধ্যে বিদ্যমান উদাহরণের জন্য যাচাই করে বা রিয়েল কমান্ডে অতিরিক্ত অবস্থানিক পরামিতি যুক্ত করে।
বিপরীতে, পরিবেশের ভেরিয়েবলগুলি একাধিক প্রোগ্রামকে প্রভাবিত করতে বোঝায়। এগুলি পরিবেশের ভেরিয়েবল, কারণ এগুলি প্রোগ্রামের বাইরেই সেট করা আছে (এর নীচে আরও)। নির্দিষ্ট পরিবেশের ভেরিয়েবল যেমন নির্দিষ্ট ফর্ম্যাট HOMEবা PATHনির্দিষ্ট অর্থ রয়েছে এবং সেগুলি প্রতিটি প্রোগ্রামের জন্য একই রকম হবে। HOMEভেরিয়েবলের অর্থ বাহ্যিক ইউটিলিটি /usr/bin/findবা আপনার শেলের মতোই হবে (এবং ফলস্বরূপ কোনও স্ক্রিপ্টে) - এটি ব্যবহারকারীর নামের হোম ডিরেক্টরি যা অধীনে প্রক্রিয়া চালিত হয়। লক্ষ্য করুন যে পরিবেশগত ভেরিয়েবলগুলি নির্দিষ্ট কমান্ড আচরণের জন্য অ্যাকাউন্টে ব্যবহৃত হতে পারে, উদাহরণস্বরূপUIDএনভায়রনমেন্ট ভেরিয়েবলটি স্ক্রিপ্টটি মূল সুবিধার সাথে চালিত হয় কিনা তা পরীক্ষা করে ব্যবহার করা যেতে পারে এবং তদনুসারে নির্দিষ্ট ক্রিয়াতে শাখা করা যেতে পারে। পরিবেশের পরিবর্তনগুলি উত্তরাধিকারসূত্রে হয় - শিশু প্রক্রিয়াগুলি পিতামাতার পরিবেশনের অনুলিপি পায়। আরও দেখুন যদি প্রক্রিয়াগুলি পিতামাতার পরিবেশের উত্তরাধিকারী হয় তবে কেন আমাদের রফতানি দরকার?
সংক্ষেপে, প্রধান পার্থক্য হ'ল পরিবেশের ভেরিয়েবলগুলি কমান্ডের বাইরে সেট করা থাকে এবং পরিবর্তিত (সাধারণত) বোঝানো হয় না, তবে অবস্থানগত পরামিতি এমন জিনিস যা কমান্ড দ্বারা প্রসেস করা হয় এবং সেগুলি পরিবর্তন হয়।
শুধু শেল ধারণা নয়
আমি মন্তব্য থেকে যা লক্ষ্য করেছি তা হ'ল আপনি টার্মিনাল এবং শেল মিশ্রিত করছেন এবং সত্যিকারের টার্মিনালগুলি সম্পর্কে পড়ার জন্য আপনাকে সুপারিশ করবে যা এককালে শারীরিক যন্ত্র ছিল। আজকাল, আমরা "টার্মিনাল" যা আমরা সাধারণত উল্লেখ করছি, কালো পটভূমি এবং সবুজ পাঠ্যযুক্ত উইন্ডোটি আসলে সফ্টওয়্যার, একটি প্রক্রিয়া। টার্মিনাল হ'ল একটি প্রোগ্রাম যা শেল চালায়, যখন শেলটিও একটি প্রোগ্রাম তবে যা কার্যকর করতে আপনি টাইপ করেন তা পড়েন (এটি যদি ইন্টারেক্টিভ শেল হয়; নন-ইন্টারেক্টিভ শেলগুলি স্ক্রিপ্ট এবং sh -c 'echo foo'অনুরোধের ধরণের হয়)। শেল এখানে আরও ।
এটি একটি গুরুত্বপূর্ণ পার্থক্য, তবে এটিও গুরুত্বপূর্ণ যে টার্মিনালটি একটি প্রোগ্রাম এবং তাই পরিবেশ এবং অবস্থানগত পরামিতিগুলির একই নিয়ম মেনে চলে। তোমার gnome-terminalযখন শুরু আপনার তাকান হবে SHELLএনভায়রনমেন্ট ভেরিয়েবল, এবং যদি না আপনার সাথে কিছু অন্যান্য কমান্ড উল্লেখ, আপনার জন্য উপযুক্ত ডিফল্ট শেল ডিম -e। ধরা যাক আমি আমার ডিফল্ট শেলটি এতে পরিবর্তন করেছি ksh - জিনোম-টার্মিনাল এর kshপরিবর্তে স্পোন হবে bash। প্রোগ্রামগুলি দ্বারা পরিবেশ কীভাবে ব্যবহৃত হয় তারও এটি একটি উদাহরণ। যদি আমি স্পষ্টভাবে বলতে gnome-terminalসঙ্গে -eনির্দিষ্ট শেল চালানোর জন্য - এটা এটা করতে হবে, কিন্তু এটা স্থায়ী হবে না। বিপরীতে, পরিবেশ বলতে বোঝানো হয় বেশিরভাগই অপরিবর্তিত (আরও পরে এটি)।
আপনি যেমন দেখতে পাচ্ছেন, পরিবেশ এবং অবস্থানগত ভেরিয়েবলগুলি কেবল একটি শেল নয়, কোনও প্রক্রিয়া / কমান্ডের বৈশিষ্ট্য। শেল স্ক্রিপ্টগুলির ক্ষেত্রে এটি সি প্রোগ্রামিং ভাষা দ্বারা নির্ধারিত মডেলটিকেও অনুসরণ করে। উদাহরণস্বরূপ সি mainফাংশনটি নিন যা সাধারণত দেখতে লাগে
int main(int argc, char **argv)
, যেখানে argcকমান্ড-লাইন আর্গুমেন্টের সংখ্যা রয়েছে এবং argvকার্যকরভাবে কমান্ড-লাইন প্যারামিটারের অ্যারে রয়েছে, এবং তারপরে ব্যবহারকারীর হোম ডিরেক্টরি পথ, ডিরেক্টরিগুলির তালিকা যেখানে আমরা এক্সিকিউটেবলের সন্ধান করতে পারি ইত্যাদি ইত্যাদির মতো জিনিস অ্যাক্সেস করার জন্য environ(লিনাক্স-এ man -e 7 environ) ফাংশন রয়েছে PATHetc. শেল স্ক্রিপ্টগুলিও একইভাবে মডেল করা হয়। শেল পরিভাষায়, আমরা অবস্থানগত পরামিতি আছে $1, $2এবং তাই ঘোষণা যখন $#অবস্থানগত পরামিতি সংখ্যা। কি হবে $0? এটি নিজেই এক্সিকিউটেবলের নাম, যা আবার সি প্রোগ্রামিং ভাষা থেকেও মডেল করা হয় - argv[0]এটি আপনার সি এর "এক্সিকিউটেবল" নাম হবে। এবং বেশিরভাগ প্রোগ্রামিং এবং স্ক্রিপ্টিং ভাষার ক্ষেত্রে এটি মোটামুটি সত্য ।
ইন্টারেক্টিভ বনাম অ-ইন্টারেক্টিভ শেল
ইতিমধ্যে আমি যে জিনিসগুলি ইঙ্গিত করেছি তার মধ্যে একটি হল ইন্টারেক্টিভ এবং অ-ইন্টারেক্টিভ শেলের মধ্যে পার্থক্য । প্রম্পট যেখানে আপনি কমান্ড টাইপ করেন - এটি ইন্টারেক্টিভ, এটি ব্যবহারকারীর সাথে ইন্টারঅ্যাক্ট করে। বিপরীতে যখন আপনার শেল স্ক্রিপ্ট থাকে বা আপনি bash -c''অ-ইন্টারেক্টিভ চালিত হন ।
এবং এখানেই পার্থক্য গুরুত্বপূর্ণ হয়ে ওঠে। আপনি যে শেলটি ইতিমধ্যে চালাচ্ছেন তা হ'ল একটি প্রক্রিয়া, যা অবস্থানগত পরামিতিগুলির সাহায্যে তৈরি হয়েছিল ( bashলগইন শেলের জন্য একটি "... যার আর্গুমেন্টের প্রথম অক্ষর হ'ল একটি - বা একটি --login বিকল্প দিয়ে শুরু হয়েছিল।" ) ( রেফারেন্স ) )
বিপরীতে, স্ক্রিপ্ট এবং শেলগুলি -cবিকল্পের সাথে চালু হয়েছে $1এবং $2যুক্তিগুলির সুবিধা নিতে পারে। এই ক্ষেত্রে,
$ bash -c 'echo $1; stat $2' sh 'Hello World' /etc/passwd
Hello World
File: '/etc/passwd'
Size: 2913 Blocks: 8 IO Block: 4096 regular file
Device: 801h/2049d Inode: 6035604 Links: 1
Access: (0644/-rw-r--r--) Uid: ( 0/ root) Gid: ( 0/ root)
Access: 2017-08-12 14:48:37.125879962 -0600
Modify: 2017-08-12 14:48:37.125879962 -0600
Change: 2017-08-12 14:48:37.137879811 -0600
Birth: -
লক্ষ্য করুন যে আমি সেখানেও ব্যবহার করেছি sh, কারণ ছোট ছোট -cবিকল্পের বিকল্পটি হ'ল প্রথম অবস্থানগত পরামিতি গ্রহণ এবং এটিকে কার্যনির্বাহিত করা $0, সাধারণত প্রোগ্রামটির নাম না হয়ে।
আরেকটি বিষয় যা লক্ষ্য করা গুরুত্বপূর্ণ তা হল অবস্থানগত পরামিতিগুলি হ'ল আমি "ফ্রেমযোগ্য" call কীভাবে দেখুন, আমরা প্রথমে bashতার নিজস্ব অবস্থানগত পরামিতিগুলি দিয়ে চালু করেছি তবে those অবস্থানিক পরামিতিগুলি echoএবং পরামিতি হয়ে গেছে stat। এবং প্রতিটি প্রোগ্রাম এটি নিজস্ব উপায়ে বোঝে। যদি আমরা statকোনও স্ট্রিং দিয়েছি Hello Worldএবং কোনও ফাইল নেই তবে Hello Worldএটির একটি ত্রুটি ঘটবে; bashএটিকে কেবল একটি সরল স্ট্রিং হিসাবে বিবেচনা করে তবে statসেই স্ট্রিংটি একটি বিদ্যমান ফাইলের নাম হিসাবে প্রত্যাশা করে। বিপরীতে, সমস্ত প্রোগ্রাম সম্মত হবে যে পরিবেশের পরিবর্তনশীল HOMEএকটি ডিরেক্টরি (যদি না প্রোগ্রামার এটি অযৌক্তিক উপায়ে কোড করে না)।
পরিবেশের ভেরিয়েবল এবং অবস্থানগত পরামিতিগুলি নিয়ে আমরা কী গোলযোগ করতে পারি?
প্রযুক্তিগতভাবে, আমরা উভয়কে নিয়েই গোলযোগ করতে পারি, তবে পরিবেশের পরিবর্তনশীলগুলির সাথে আমাদের গণ্ডগোল করা উচিত নয় , যখন আমাদের প্রায়শই অবস্থানগত পরামিতি সরবরাহ করতে হয়। আমরা ভেরিয়েবলের প্রিন্টিং সহ শেল কমান্ড চালাতে পারি:
$ hello=world bash -c 'echo $hello'
world
আমরা export variable=valueশেল বা স্ক্রিপ্টের মধ্যে থেকে কেবল পরিবেশে ভেরিয়েবলগুলি রাখতে পারি । অথবা আমরা সম্পূর্ণ খালি পরিবেশ সহ একটি কমান্ড চালাতে পারি env -c command arg1 arg2। তবে সাধারণত পরিবেশের সাথে গোলমাল করার পরামর্শ দেওয়া হয় না, বিশেষত আপার কেস ভেরিয়েবলগুলি ব্যবহার করা বা ইতিমধ্যে বিদ্যমান পরিবেশের ভেরিয়েবলগুলি ওভাররাইট করা। লক্ষ্য করুন যে প্রস্তাবিত যদিও মানক নয়।
অবস্থানগত পরামিতিগুলির জন্য, তাদের সেট করার উপায়টি সুস্পষ্ট, কেবল তাদের কমান্ডে প্রিপেন্ড করুন, তবে এগুলি অন্যান্য বুদ্ধিমান সেট করার পাশাপাশি shiftকমান্ডের মাধ্যমে para পরামিতিগুলির তালিকা পরিবর্তন করার উপায় রয়েছে ।
উপসংহারে, এই দুটির উদ্দেশ্য আলাদা এবং এটি একটি কারণে বিদ্যমান reason আমি আশা করি লোকেরা এই উত্তরটি থেকে কিছুটা অন্তর্দৃষ্টি পেয়েছিল এবং আমার এই উত্তরটি লেখার মতোই এটি পড়তে মজা লাগছিল।
সেট কমান্ড নোট
setকমান্ড, তাই মত ম্যানুয়াল আচরণ করবে অনুযায়ী (ব্যাশ ম্যানুয়াল থেকে জোর যোগ):
বিকল্পগুলি ছাড়াই, প্রতিটি শেল ভেরিয়েবলের নাম এবং মান একটি ফর্ম্যাটে প্রদর্শিত হয় যা বর্তমানে-সেট ভেরিয়েবলগুলি সেট বা পুনরায় সেট করার জন্য ইনপুট হিসাবে পুনরায় ব্যবহার করা যেতে পারে।
অন্য কথায় setশেলের জন্য নির্দিষ্ট ভেরিয়েবলগুলি দেখায়, উদাহরণস্বরূপ কিছু পরিবেশে ঘটে HOME। বিপরীতে কমান্ড দ্বারা লাইক করুন envএবং printenvপ্রকৃত পরিবেশের পরিবর্তনশীল দেখুন যা দিয়ে একটি কমান্ড চালিত হয়। আরও দেখুন এই ।
export 3পরিণত করতে পারবেন না$3। আপনি পারবেন নাunset 3; এবং আপনি$3ব্যবহার করে একটি নতুন মান নির্ধারণ করতে পারবেন না3=val।