শেল স্ক্রিপ্টগুলিতে এক্সিকিউট কমান্ডের ব্যবহারগুলি কী?


249

সহজ উদাহরণ সহ শেল স্ক্রিপ্টিং এ এক্সিকিউটিভ কমান্ডের ব্যবহারগুলি কি কেউ ব্যাখ্যা করতে পারেন?


31
Linux.about.com- এর লিঙ্কগুলি সহায়ক নয়। তারা 'এম্পিকিউটিভ' ব্যবহার করে কমান্ডের কমান্ড বা পাইপলাইন কার্যকর করে কীভাবে কেবল কার্যকরভাবে চালানো থেকে আলাদা তা এগুলি দূর থেকে পরিষ্কার করে দেয় না। সুতরাং ওপির প্রশ্ন "এক্সেকের ব্যবহার কী?"
জোনাথন হার্টলি

2
স্ট্যাক ওভারফ্লো প্রোগ্রামিং এবং বিকাশের প্রশ্নের জন্য একটি সাইট। এই প্রশ্নটি অফ-টপিক হিসাবে উপস্থিত বলে মনে হচ্ছে কারণ এটি প্রোগ্রামিং বা উন্নয়ন সম্পর্কিত নয়। সহায়তা কেন্দ্রে আমি এখানে কোন বিষয় সম্পর্কে জিজ্ঞাসা করতে পারি তা দেখুন । সম্ভবত সুপার ইউজার বা ইউনিক্স ও লিনাক্স স্ট্যাক এক্সচেঞ্জ জিজ্ঞাসা করতে একটি ভাল জায়গা হবে।
jww

উত্তর:


281

execকার্নেলের মধ্যে বিল্ট-ইন কমান্ড আয়না ফাংশন, তাদের একটি পরিবার উপর ভিত্তি করে execve, যা সাধারণত সি থেকে বলা হয়

execforkএকটি নতুন প্রক্রিয়া ইঙ্গিত না করে বর্তমান প্রক্রিয়াটিতে বর্তমান প্রোগ্রামটি প্রতিস্থাপন করে । এটি আপনার লেখা প্রতিটি স্ক্রিপ্ট আপনি ব্যবহার করবেন এমন কিছু নয়, তবে এটি উপলক্ষে কার্যকর হয়। এখানে আমি এটি ব্যবহার করেছি এমন কিছু পরিস্থিতিতে রয়েছে;

  1. আমরা শেল অ্যাক্সেস ছাড়াই ব্যবহারকারীর একটি নির্দিষ্ট অ্যাপ্লিকেশন প্রোগ্রামটি চালাতে চাই। আমরা / ইত্যাদি / পাসডাব্লুডে সাইন-ইন প্রোগ্রামটি পরিবর্তন করতে পারতাম, তবে আমরা সম্ভবত স্টার্ট-আপ ফাইলগুলি থেকে পরিবেশ সেটিংটি ব্যবহার করা চাই। সুতরাং, ইন (বলুন) .profile, শেষ বিবৃতিটি এমন কিছু বলে:

     exec appln-program

    সুতরাং এখন আর ফিরে যাওয়ার কোনও শেল নেই। এমনকি যদি appln-programক্র্যাশ হয় তবে শেষ-ব্যবহারকারী শেলটিতে যেতে পারে না, কারণ এটি সেখানে নেই - execপ্রতিস্থাপনটি এটি।

  2. আমরা / ইত্যাদি / পাসডাব্লুডিতে একটি আলাদা শেল ব্যবহার করতে চাই। বোকা যেমন মনে হতে পারে, কিছু সাইট ব্যবহারকারীদের তাদের সাইন-ইন শেল পরিবর্তন করতে দেয় না। আমি জানি যে একটি সাইট প্রত্যেকের সাথেই শুরু হয়েছিল cshএবং প্রত্যেকে তাদের .login(সিএসএস স্টার্ট-আপ ফাইল) কল করে ksh। এটি কাজ করার সময়, এটি একটি বিপথগামী cshপ্রক্রিয়াটি চালিয়ে যায় এবং লগআউটটি দুটি পর্যায়ে যা বিভ্রান্ত হতে পারে। সুতরাং আমরা এটিকে পরিবর্তিত করেছি exec kshযা কেবল শ-শেল প্রোগ্রামকে কর্ন শেলের সাথে প্রতিস্থাপন করেছে এবং সবকিছুকে সহজ করে তুলেছে (এটির সাথে অন্যান্য সমস্যা রয়েছে যেমন kshলগইন-শেল নয় এই বিষয়টি )।

  3. শুধু প্রক্রিয়া সংরক্ষণ করতে। যদি আমরা 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

22
এখানে আরও একটি ব্যবহার রয়েছে যা আমি খুব সহজ এবং উল্লেখযোগ্য বলে মনে করি কারণ এটি পাইথন ওয়েব অ্যাপ্লিকেশনগুলির সাথে সম্পর্কিত এবং আপনার (দুর্দান্ত) উত্তরগুলির মধ্যে 2 এবং 3 এর মধ্যে কিছু মনে হয় আমি সাধারণত একটি সুপারভাইজারের মাধ্যমে বন্দুকের ডাকে কল করে ডাব্লুএসজি ওয়েব অ্যাপস (ডিজেঙ্গো বা ফ্লাস্ক বলি) চালনা করি অ্যাপ্লিকেশন: পরেরটি কুখ্যাতভাবে বেশ কয়েকটি পরিবেশের ভেরিয়েবলের প্রয়োজন, এটি শেল স্ক্রিপ্ট থেকে সহজতর এবং আরও রক্ষণাবেক্ষণযোগ্য গনকোনাকর্ন যা সবকিছু সেট করে এবং অবশেষে exec gunicornতদারকীর কাছে সঠিক পিডটি ফেরত দেয়।
gru

1
ডক্সগুলি বলে যে execএটি পুনঃনির্দেশের জন্য ব্যবহার করা যেতে পারে:> যদি কমান্ড নির্দিষ্ট না করা থাকে তবে বর্তমান শেলটিতে কোনও পুনর্নির্দেশগুলি কার্যকর হয় এবং রিটার্নের স্থিতি 0 হয় a যদি কোনও পুনঃনির্দেশের ত্রুটি থাকে তবে রিটার্নের স্থিতি 1 হয় how তবে কীভাবে হয় execএকটি ফাইল বর্ণনাকারী পরিবর্তন কাজ? এই বিশেষ আদেশটি এই কাজের জন্য কেন বেছে নেওয়া হয়েছে? (মার্কডাউন এখনই ব্যর্থ হচ্ছে?)
রে

@ রে: সেরা আমি এটি করতে পারি: pubs.opengroup.org/onlinepubs/009604599/utilities/exec.html । আপনার যদি কীভাবে জানতে হয় তবে শেল উত্স কোডটি কীভাবে দেখুন।
সিডারকে

7
অন্য ব্যবহার: স্ক্রিপ্টের সমস্ত আউটপুট একটি লগফাইলে পুনর্নির্দেশ করুনexec >.\logfilename.log 2>&1
হোগান

1
@ কারমাজেডন: &>একটি bashএক্সটেনশন (দেখুন man bash) এবং আপনার উদাহরণটি সমান exec >/var/log/userdata.log 2>&1। অন্য কথায় এটি স্টডআউট এবং স্টডারকে সেই ফাইলটিতে পুনঃনির্দেশ করে। কমান্ডগুলি অনুসরণ করে সেগুলি পুনরায় সেট না করা হলে পুনরায়নির্দেশগুলির উত্তরাধিকারী হবে তবে তাদের কার্যকর করা হবে exec
সিডরেকে

41

কেবলমাত্র একটি সংক্ষিপ্ত নবাগত-বান্ধব সংক্ষিপ্ত উত্তর দিয়ে গৃহীত উত্তরটি বাড়ানোর জন্য আপনার সম্ভবত প্রয়োজন নেই exec

আপনি যদি এখনও এখানে থাকেন তবে নিম্নলিখিত আলোচনাটি আশাবাদী কেন তা প্রকাশ করা উচিত। যখন আপনি দৌড়াবেন, বলুন,

sh -c 'command'

আপনি একটি shদৃষ্টান্ত চালান , তারপরে commandসেই shদৃষ্টান্তের শিশু হিসাবে শুরু করুন । commandশেষ হয়ে গেলে , shউদাহরণটিও শেষ হয়।

sh -c 'exec command'

একটি shউদাহরণ চালায় , তারপরে বাইনারি দিয়ে সেই দৃষ্টান্তটি প্রতিস্থাপন করে এবং পরিবর্তে চালিত করে runsshcommand

অবশ্যই, এই দু'টিই এই সীমিত প্রসঙ্গে অনর্থক; আপনি কেবল চান

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কোনও কমান্ডের পরিবর্তে একটি পুনর্নির্দেশের পরে অনুসরণ করা ম্যানুয়ালটিতে স্থির করব ।


2
আপনার নিজস্ব স্পিফাই শেল কল করার প্রলোভন প্রতিহত করা bush। অবশ্যই, এটি প্রযোজ্য bashবা সাধারণত কোনও জনপ্রিয় ইউনিক্স শেলও; যদিও @ নানসনে নোট হিসাবে , বাশ গোপনে bash -c 'command'আসলে কাজটি করে অনুকূলিত করে exec command
ট্রিপলি

1
শেলের প্রস্থান কোডটি সাধারণত এটি সম্পাদিত শেষ আদেশের প্রস্থান কোড হয় is অবশ্যই, যদি শেলটি চালাতে ব্যর্থ হয় বা কমান্ড কার্যকর করতে ব্যর্থ হয় তবে শেলের প্রস্থান স্থিতিটি উপযুক্ত ত্রুটি কোড সহ এটি প্রতিফলিত করবে।
ট্রিপলি

2
@ জোনাথনলফলার আমি ইচ্ছাকৃতভাবে একটি অ্যান্টিপ্যাটার্ন নথি করছি যা আমি নবাগত প্রশ্নের মধ্যে দেখতে পাচ্ছি। এইটিকে এই সদৃশ দ্বারা অনুরোধ করা হয়েছিল তবে আমি এটি আগে দেখেছি, তাই আমি এটি বিশেষভাবে কভার করতে চেয়েছিলাম।
ট্রিপলি

2
@ জোনাথনলফলার মাইনর শব্দের টুইট এটা কি যথেষ্ট, আপনি কি ভাবেন? সাহায্য করার জন্য ধন্যবাদ.
ট্রিপলি

2
ধন্যবাদ - এই অপ্টিমাইজেশন সম্পর্কে আমি আরও একটি সংক্ষিপ্ত অনুচ্ছেদ যুক্ত করেছি। আপনার যদি অন্য আপত্তি থাকে বা আপনি যদি অন্য কোনও কোণ থেকে জিনিসগুলি ব্যাখ্যা করতে চান তবে এটি সত্যই পরিষ্কার নয়।
ট্রিপলি
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.