সহজ উদাহরণ সহ শেল স্ক্রিপ্টিং এ এক্সিকিউটিভ কমান্ডের ব্যবহারগুলি কি কেউ ব্যাখ্যা করতে পারেন?
সহজ উদাহরণ সহ শেল স্ক্রিপ্টিং এ এক্সিকিউটিভ কমান্ডের ব্যবহারগুলি কি কেউ ব্যাখ্যা করতে পারেন?
উত্তর:
exec
কার্নেলের মধ্যে বিল্ট-ইন কমান্ড আয়না ফাংশন, তাদের একটি পরিবার উপর ভিত্তি করে execve
, যা সাধারণত সি থেকে বলা হয়
exec
fork
একটি নতুন প্রক্রিয়া ইঙ্গিত না করে বর্তমান প্রক্রিয়াটিতে বর্তমান প্রোগ্রামটি প্রতিস্থাপন করে । এটি আপনার লেখা প্রতিটি স্ক্রিপ্ট আপনি ব্যবহার করবেন এমন কিছু নয়, তবে এটি উপলক্ষে কার্যকর হয়। এখানে আমি এটি ব্যবহার করেছি এমন কিছু পরিস্থিতিতে রয়েছে;
আমরা শেল অ্যাক্সেস ছাড়াই ব্যবহারকারীর একটি নির্দিষ্ট অ্যাপ্লিকেশন প্রোগ্রামটি চালাতে চাই। আমরা / ইত্যাদি / পাসডাব্লুডে সাইন-ইন প্রোগ্রামটি পরিবর্তন করতে পারতাম, তবে আমরা সম্ভবত স্টার্ট-আপ ফাইলগুলি থেকে পরিবেশ সেটিংটি ব্যবহার করা চাই। সুতরাং, ইন (বলুন) .profile
, শেষ বিবৃতিটি এমন কিছু বলে:
exec appln-program
সুতরাং এখন আর ফিরে যাওয়ার কোনও শেল নেই। এমনকি যদি appln-program
ক্র্যাশ হয় তবে শেষ-ব্যবহারকারী শেলটিতে যেতে পারে না, কারণ এটি সেখানে নেই - exec
প্রতিস্থাপনটি এটি।
আমরা / ইত্যাদি / পাসডাব্লুডিতে একটি আলাদা শেল ব্যবহার করতে চাই। বোকা যেমন মনে হতে পারে, কিছু সাইট ব্যবহারকারীদের তাদের সাইন-ইন শেল পরিবর্তন করতে দেয় না। আমি জানি যে একটি সাইট প্রত্যেকের সাথেই শুরু হয়েছিল csh
এবং প্রত্যেকে তাদের .login
(সিএসএস স্টার্ট-আপ ফাইল) কল করে ksh
। এটি কাজ করার সময়, এটি একটি বিপথগামী csh
প্রক্রিয়াটি চালিয়ে যায় এবং লগআউটটি দুটি পর্যায়ে যা বিভ্রান্ত হতে পারে। সুতরাং আমরা এটিকে পরিবর্তিত করেছি exec ksh
যা কেবল শ-শেল প্রোগ্রামকে কর্ন শেলের সাথে প্রতিস্থাপন করেছে এবং সবকিছুকে সহজ করে তুলেছে (এটির সাথে অন্যান্য সমস্যা রয়েছে যেমন ksh
লগইন-শেল নয় এই বিষয়টি )।
শুধু প্রক্রিয়া সংরক্ষণ করতে। যদি আমরা prog1 -> prog2 -> prog3 -> prog4
ইত্যাদি কল করি এবং কখনই ফিরে না যাই, তবে প্রতিটি কলকে একটি এক্সিকিউট করুন। এটি সংস্থানগুলি সংরক্ষণ করে (বেশি নয়, স্বীকারোক্তিযুক্ত, পুনরাবৃত্তি না করা) এবং শাটডাউনকে সহজ করে তোলে।
আপনি স্পষ্টতই exec
কোথাও ব্যবহৃত দেখেছেন , সম্ভবত আপনি যদি কোডটি দেখিয়ে থাকেন যা আপনাকে বগ করছে তবে আমরা এর ব্যবহারকে ন্যায়সঙ্গত করতে পারি।
সম্পাদনা : আমি বুঝতে পেরেছি যে আমার উপরের উত্তরটি অসম্পূর্ণ। আছে দুই ব্যবহার exec
শেল পছন্দ মধ্যে ksh
এবং bash
খোলার ফাইল বর্ণনাকারী জন্য ব্যবহৃত -। এখানে কিছু উদাহরন:
exec 3< thisfile # open "thisfile" for reading on file descriptor 3
exec 4> thatfile # open "thatfile" for writing on file descriptor 4
exec 8<> tother # open "tother" for reading and writing on fd 8
exec 6>> other # open "other" for appending on file descriptor 6
exec 5<&0 # copy read file descriptor 0 onto file descriptor 5
exec 7>&4 # copy write file descriptor 4 onto 7
exec 3<&- # close the read file descriptor 3
exec 6>&- # close the write file descriptor 6
নোট করুন যে এখানে ব্যবধান খুব গুরুত্বপূর্ণ। আপনি যদি fd সংখ্যা এবং পুনঃনির্দেশ চিহ্নের মধ্যে একটি স্থান রাখেন exec
তবে মূল অর্থটিতে ফিরে আসে:
exec 3 < thisfile # oops, overwrite the current program with command "3"
এগুলি ব্যবহার করতে পারেন এমন কয়েকটি উপায় রয়েছে, ksh ব্যবহারে read -u
বা print -u
, bash
উদাহরণস্বরূপ:
read <&3
echo stuff >&4
exec gunicorn
তদারকীর কাছে সঠিক পিডটি ফেরত দেয়।
exec
এটি পুনঃনির্দেশের জন্য ব্যবহার করা যেতে পারে:> যদি কমান্ড নির্দিষ্ট না করা থাকে তবে বর্তমান শেলটিতে কোনও পুনর্নির্দেশগুলি কার্যকর হয় এবং রিটার্নের স্থিতি 0 হয় a যদি কোনও পুনঃনির্দেশের ত্রুটি থাকে তবে রিটার্নের স্থিতি 1 হয় how তবে কীভাবে হয় exec
একটি ফাইল বর্ণনাকারী পরিবর্তন কাজ? এই বিশেষ আদেশটি এই কাজের জন্য কেন বেছে নেওয়া হয়েছে? (মার্কডাউন এখনই ব্যর্থ হচ্ছে?)
exec >.\logfilename.log 2>&1
&>
একটি bash
এক্সটেনশন (দেখুন man bash
) এবং আপনার উদাহরণটি সমান exec >/var/log/userdata.log 2>&1
। অন্য কথায় এটি স্টডআউট এবং স্টডারকে সেই ফাইলটিতে পুনঃনির্দেশ করে। কমান্ডগুলি অনুসরণ করে সেগুলি পুনরায় সেট না করা হলে পুনরায়নির্দেশগুলির উত্তরাধিকারী হবে তবে তাদের কার্যকর করা হবে exec
কেবলমাত্র একটি সংক্ষিপ্ত নবাগত-বান্ধব সংক্ষিপ্ত উত্তর দিয়ে গৃহীত উত্তরটি বাড়ানোর জন্য আপনার সম্ভবত প্রয়োজন নেই exec
।
আপনি যদি এখনও এখানে থাকেন তবে নিম্নলিখিত আলোচনাটি আশাবাদী কেন তা প্রকাশ করা উচিত। যখন আপনি দৌড়াবেন, বলুন,
sh -c 'command'
আপনি একটি sh
দৃষ্টান্ত চালান , তারপরে command
সেই sh
দৃষ্টান্তের শিশু হিসাবে শুরু করুন । command
শেষ হয়ে গেলে , sh
উদাহরণটিও শেষ হয়।
sh -c 'exec command'
একটি sh
উদাহরণ চালায় , তারপরে বাইনারি দিয়ে সেই দৃষ্টান্তটি প্রতিস্থাপন করে এবং পরিবর্তে চালিত করে runssh
command
অবশ্যই, এই দু'টিই এই সীমিত প্রসঙ্গে অনর্থক; আপনি কেবল চান
command
কিছু শৃঙ্খলা পরিস্থিতি রয়েছে যেখানে আপনি শেলটি এর কনফিগারেশন ফাইলটি পড়তে চান বা অন্যথায় চালানোর জন্য প্রস্তুতি হিসাবে পরিবেশ স্থাপন করুন command
। এটি কার্যত কার্যকর একমাত্র পরিস্থিতি exec command
।
#!/bin/sh
ENVIRONMENT=$(some complex task)
exec command
এটি পরিবেশ প্রস্তুত করার জন্য কিছু স্টাফ তৈরি করে যাতে এটিতে প্রয়োজনীয় যা রয়েছে। এটি হয়ে গেলে, sh
উদাহরণটি আর প্রয়োজন হয় না এবং তাই শিশু প্রক্রিয়া হিসাবে চালিত হয়ে অপেক্ষা করার পরিবর্তে কেবল sh
উদাহরণটি command
প্রক্রিয়াটির সাথে প্রতিস্থাপন করার জন্য এটি একটি অপ্রয়োজনীয় (অপ্রয়োজনীয়) অনুকূলতা sh
, তারপরে এটি শেষ হওয়ার সাথে সাথে প্রস্থান করুন।
একইভাবে, আপনি যদি একটি শেল স্ক্রিপ্টের শেষে হেভিশ কমান্ডের জন্য যথাসম্ভব রিসোর্স মুক্ত করতে চান তবে আপনি exec
সেই আদেশটি অপ্টিমাইজেশন হিসাবে নিতে চাইতে পারেন ।
যদি কিছু আপনাকে দৌড়াতে বাধ্য করে sh
তবে আপনি সত্যিই অন্য কিছু চালাতে চান, exec something else
অবশ্যই অনাকাঙ্ক্ষিত sh
দৃষ্টান্ত প্রতিস্থাপন করার জন্য কাজ করা (উদাহরণস্বরূপ যদি আপনি যদি সত্যিকারের gosh
পরিবর্তে আপনার নিজস্ব স্পাইফাই চালাতে চান sh
তবে আপনার তালিকাভুক্ত না হয় /etc/shells
তবে আপনি পারেন এটি আপনার লগইন শেল হিসাবে নির্দিষ্ট করবেন না)।
exec
ফাইল বর্ণনাকারীদের কৌশলগত ব্যবহারের দ্বিতীয় ব্যবহারটি একটি পৃথক বিষয়। গৃহীত উত্তরটি দুর্দান্তভাবে কভার করে; এই স্ব-অন্তর্ভুক্ত রাখার জন্য, আমি কেবল exec
কোনও কমান্ডের পরিবর্তে একটি পুনর্নির্দেশের পরে অনুসরণ করা ম্যানুয়ালটিতে স্থির করব ।