পূর্বশর্ত:
এই নির্দেশিকায় প্রদর্শিত পদক্ষেপগুলি সম্পাদন করতে, আপনার নিম্নলিখিত উপাদানগুলির প্রয়োজন:
- একটি কার্যকরী লিনাক্স সিস্টেম। এই সম্পর্কে আরও জানো ভার্চুয়ালবক্স ব্যবহার করে একটি উবুন্টু ভিএম সেট আপ করুন .
- অ্যাক্সেস a সুডো বিশেষাধিকার সহ অ-রুট ব্যবহারকারী .
- একটি উপযুক্ত পাঠ্য সম্পাদক। উদাহরণ স্বরূপ: কেন / নিওভিম , ন্যানো , সাবলাইম টেক্সট , ভিএসসিডিয়াম , ইত্যাদি
Exec কমান্ড
exec কমান্ড নিজেই একটি পৃথক টুল নয়:
$ যা exec
বরং, এটি ব্যাশ শেলের একটি অভ্যন্তরীণ কমান্ড:
$ মানুষ exec
ম্যান পৃষ্ঠার বর্ণনা অনুসারে, যদি একটি কমান্ড নির্দিষ্ট করা হয়, exec এটির সাথে শেল প্রতিস্থাপন করে, কোন অতিরিক্ত প্রক্রিয়া তৈরি করে না। এখানে কয়েকটি বিকল্প উপলব্ধ রয়েছে যা exec কমান্ডের আচরণ পরিবর্তন করে।
মৌলিক ব্যবহার
ডিফল্টরূপে, যখনই একটি কমান্ড চালানো হয়, Bash একটি সাবশেল তৈরি করে এবং কমান্ডটি ফর্ক করে।
$ প্রতিধ্বনি $$ && ঘুম 999$ pstree -পি
এখানে, ইকো কমান্ড বর্তমান শেলের পিআইডি প্রিন্ট করে। ব্যাশ শেল (পিআইডি: 978) স্লিপ কমান্ডের (পিআইডি: 8369) সাথে কাজ করার জন্য একটি নতুন শিশু প্রক্রিয়া তৈরি করে।
এখন, যদি আমরা exec ব্যবহার করে স্লিপ কমান্ড চালাই?
$ প্রতিধ্বনি $$ && exec ঘুম 999$ pstree -p
প্যারেন্ট ব্যাশ প্রক্রিয়া স্লিপ কমান্ড দ্বারা প্রতিস্থাপিত হয়। সফলভাবে কার্যকর করার পরে, এটি শেলে ফিরে আসে না। পরিবর্তে, অধিবেশন সমাপ্ত করা হয়.
পরিচ্ছন্ন পরিবেশ
ডিফল্ট ব্যাশ কনফিগারেশন একগুচ্ছ টুইক এবং পরিবেশ ভেরিয়েবলের সাথে আসে। নির্দিষ্ট পরিস্থিতিতে (ডিবাগিং, উদাহরণস্বরূপ), আপনি একটি পরিষ্কার পরিবেশে আপনার স্ক্রিপ্ট/প্রোগ্রাম চালাতে চাইতে পারেন। exec এর সাহায্যে, আমরা বর্তমানের জায়গায় একটি ক্লিন শেল ইনস্ট্যান্স চালু করতে পারি।
প্রথমে, বর্তমানে কনফিগার করা সমস্ত পরিবেশ ভেরিয়েবল তালিকা করতে printenv কমান্ডটি ব্যবহার করুন:
$ printenv
এখন, একটি পরিষ্কার উদাহরণ চালু করতে exec ব্যবহার করুন:
$ exec -গ বাশ$ printenv
একটি ভিন্ন শেল চালু করা হচ্ছে
Bash এবং 'sh' ছাড়াও, আরও একাধিক শেল প্রোগ্রাম উপলব্ধ রয়েছে, প্রতিটি তাদের অনন্য সুবিধা সহ। যদি একটি প্রোগ্রাম/স্ক্রিপ্টের জন্য একটি নির্দিষ্ট শেল প্রয়োজন হয়, আপনি বর্তমান ব্যাশ শেলটিকে পছন্দসই একটি দিয়ে প্রতিস্থাপন করতে exec ব্যবহার করতে পারেন।
নিম্নলিখিত উদাহরণে, আমরা ব্যাশকে 'sh' দিয়ে প্রতিস্থাপন করি:
$ pstree -পি$ exec শ
$ pstree -পি
স্ক্রিপ্টে Exec ব্যবহার করা
বেসিকগুলি শেষ হওয়ার সাথে সাথে, আমরা এখন আমাদের শেল স্ক্রিপ্টগুলিতে exec ব্যবহার শুরু করতে পারি।
উদাহরণ 1: বিভিন্ন শেল দিয়ে কাজ করা
নিম্নলিখিত স্ক্রিপ্ট পরীক্ষা করে দেখুন:
#!/bin/bashপ্রতিধ্বনি $শেল
প্রতিধ্বনি 'echo zsh সফলভাবে চালু হয়েছে' > zsh.sh
exec zsh zsh.sh
এখানে, প্রথম ইকো কমান্ড বর্তমান শেল প্রিন্ট করে। ডিফল্টরূপে, এটি Bash হওয়া উচিত। তারপর, exec কমান্ড 'zsh.sh' স্ক্রিপ্ট চালানোর জন্য 'zsh' চালু করে।
নিম্নলিখিত স্ক্রিপ্ট চালান:
$ . / test.sh
উদাহরণ 2: বিদ্যমান প্রক্রিয়া ওভাররাইড করা
যখনই একটি কমান্ড/প্রোগ্রাম কল করা হয়, তখন ব্যাশ একটি নতুন প্রক্রিয়া তৈরি করে। বেশিরভাগ পরিস্থিতিতে, এটি উদ্বেগের বিষয় নয়। যাইহোক, খুব সীমিত সংস্থান সহ একটি সিস্টেমের সাথে কাজ করার সময় (এমবেডেড হার্ডওয়্যার, উদাহরণস্বরূপ), মেমরিতে বিদ্যমান প্রক্রিয়াটিকে ওভাররাইড করতে exec ব্যবহার করা সাহায্য করতে পারে।
নিম্নলিখিত স্ক্রিপ্ট পরীক্ষা করে দেখুন:
#!/bin/bashpstree -পি
exec pstree -পি
প্রতিধ্বনি 'ওহে বিশ্ব'
এখানে, প্রথম pstree কমান্ডটি প্রসেস ট্রির আসল লেআউট দেখায়। exec কমান্ড চালানো হলে, দ্বিতীয় pstree কমান্ড চলমান শেল প্রতিস্থাপন করে। শেষ লাইনে ইকো কমান্ডটি কার্যকর করা হয়নি।
নিম্নলিখিত স্ক্রিপ্ট চালান:
$ . / test.sh
যেহেতু এটি স্ক্রিপ্টের একটি অংশ ছিল, আমরা সফলভাবে কার্যকর করার পরে মূল শেলটিতে ফিরে আসি।
যেহেতু exec কমান্ড প্যারেন্ট শেলকে একটি ভিন্ন কমান্ড/প্রোগ্রাম দিয়ে প্রতিস্থাপন করে, তার পরে যেকোনো কোড অবৈধ হয়ে যায়। আপনার স্ক্রিপ্টে সেগুলি ব্যবহার করার সময় সতর্ক থাকুন।
উদাহরণ 3: লগিং
ব্যাশ শেল যেকোনো চলমান প্রোগ্রাম/স্ক্রিপ্টে 3টি অনন্য ফাইল বর্ণনাকারী অফার করে:
- STDOUT (1): স্ট্যান্ডার্ড আউটপুট, সাধারণ আউটপুট সঞ্চয় করে
- STDERR (2): স্ট্যান্ডার্ড ত্রুটি, ত্রুটি বার্তা সংরক্ষণ করে
- STDIN (0): স্ট্যান্ডার্ড ইনপুট
exec ব্যবহার করে, আমরা এই ফাইল বর্ণনাকারীদের একটি ভিন্ন অবস্থানে পুনঃনির্দেশ করতে পারি, উদাহরণস্বরূপ: লগ ফাইল। এটি সাধারণভাবে ডিবাগিং এবং লগিং করতে সাহায্য করতে পারে।
সাধারণত, আপনি যদি একটি লগ ফাইলে STDOUT এবং STDERR পুনঃনির্দেশ করতে চান, আপনি পুনঃনির্দেশ অপারেটর ব্যবহার করেন:
$ প্রতিধ্বনি $$ | টি test.log$ সন্ন্যাসী 2 >& 1 | টি test.log
এই পদ্ধতিতে আপনি লগ করতে চান এমন প্রতিটি পয়েন্টে পুনঃনির্দেশ প্রয়োজন। এই সমস্যাটি সমাধান করার জন্য, আমরা শেল সেশনের জন্য একটি স্থায়ী পুনঃনির্দেশ তৈরি করতে exec কমান্ড ব্যবহার করতে পারি। নিম্নলিখিত উদাহরণ দেখুন:
#!/bin/bash> test.log
exec 1 >> test.log
exec 2 >& 1
প্রতিধ্বনি 'ওহে বিশ্ব'
ভুল_আদেশ
এখানে, প্রথম লাইনটি একটি খালি লগ ফাইল তৈরি করে। প্রথম exec কমান্ড লগ ফাইলে STDOUT-এর একটি স্থায়ী পুনঃনির্দেশ স্থাপন করে। দ্বিতীয় exec কমান্ড STDERR কে STDOUT এ পুনঃনির্দেশ করে।
এই সেটআপের সাথে, সমস্ত আউটপুট এবং ত্রুটি বার্তাগুলি লগ ফাইলে ডাম্প করা হয়:
$ / test.sh$ বিড়াল test.log
যদি স্ক্রিপ্ট ক্রমাগত লগ এন্ট্রি তৈরি করে?
#!/bin/bash> test.log
exec 1 >> test.log
exec 2 >& 1
যখন সত্য
করতে
প্রতিধ্বনি $RANDOM
ঘুম 5
সম্পন্ন
এখানে, প্রথম অংশে, আমরা আমাদের লগ ফাইলে STDOUT এবং STDERR-এর একটি স্থায়ী পুনঃনির্দেশ তৈরি করি। infinite while loop ইকো কমান্ড চালায় যতক্ষণ না আমরা 'Ctrl + C' ব্যবহার করে জোর করে বন্ধ না করি। $RANDOM ভেরিয়েবল হল একটি বিশেষ ভেরিয়েবল যা প্রতিবার অ্যাক্সেস করার সময় একটি এলোমেলো স্ট্রিং প্রদান করে।
লগ এন্ট্রি আপডেট করার জন্য, নিম্নলিখিত টেল কমান্ডটি ব্যবহার করুন:
$ লেজ -চ test.log
মনে রাখবেন যে এই পুনঃনির্দেশটি শুধুমাত্র শেল সেশনের জন্য স্থায়ী হয়।
উদাহরণ 4: ফাইল থেকে ইনপুট
আমরা যেভাবে একটি স্থায়ী STDOUT এবং STDERR পুনঃনির্দেশ তৈরি করেছি, একইভাবে আমরা STDIN-এর জন্যও একটি তৈরি করতে পারি। যাইহোক, যেহেতু STDIN ইনপুটের জন্য ব্যবহৃত হয়, তাই বাস্তবায়ন একটু ভিন্ন।
নিম্নলিখিত স্ক্রিপ্টে, আমরা একটি ফাইল থেকে STDIN গ্রহণ করি:
#!/bin/bashপ্রতিধ্বনি 'প্রতিধ্বনি' ওহে বিশ্ব '' > ইনপুট
exec < ইনপুট
পড়া লাইন 1
eval $লাইন_1
এখানে, প্রথম লাইনে, আমরা redirection ব্যবহার করে input_string ফাইলের বিষয়বস্তু তৈরি করতে echo ব্যবহার করি। exec কমান্ড বর্তমান শেল সেশনের STDIN-এ input_string-এর বিষয়বস্তু পুনর্নির্দেশ করে। স্ট্রিং পড়ার পর, আমরা $line_1-এর বিষয়বস্তুকে শেল কোড হিসাবে বিবেচনা করতে eval ব্যবহার করি।
নিম্নলিখিত স্ক্রিপ্ট চালান:
$ . / test.sh
উপসংহার
আমরা Bash এ exec কমান্ড সম্পর্কে আলোচনা করেছি। আমরা স্ক্রিপ্টে এটি ব্যবহারের বিভিন্ন উপায়ও প্রদর্শন করেছি। আমরা একাধিক শেলগুলির সাথে কাজ করতে, মেমরি কার্যকরী স্ক্রিপ্ট তৈরি করতে এবং ফাইল বর্ণনাকারীকে পুনঃনির্দেশ করতে exec ব্যবহার করে দেখিয়েছি।
এটি ব্যাশ স্ক্রিপ্টিং ব্যবহার করে যা অর্জন করা যায় তার একটি ছোট অংশ। থেকে ব্যাশ স্ক্রিপ্টিং সম্পর্কে আরও জানুন ব্যাশ প্রোগ্রামিং উপ-শ্রেণী।
শুভ কম্পিউটিং!