কেন সিস্টেমেটিএল \ {পুনরায় চালু হবে না, স্থিতি} sh sshd \; কাজ করে?


14

প্রতিধ্বনির মধ্য দিয়ে উপরোক্ত কমান্ডের আউটপুটটি হ'ল:

# echo systemctl\ {restart,status}\ sshd\;
systemctl restart sshd; systemctl status sshd;

এমনকি যদি আমি আউটপুটটি টার্মিনালে পেস্ট করি তবে কমান্ডটি কাজ করে। কিন্তু যখন আমি সরাসরি কমান্ডটি চালানোর চেষ্টা করি তখন আমি পেতাম:

# systemctl\ {restart,status}\ sshd\;
bash: systemctl restart sshd;: command not found...

আমার দুটি প্রশ্ন আছে ..

  1. প্রতিস্থাপন এবং সম্প্রসারণের এই পদ্ধতিটি কী বলা হয়? (যাতে আমি এটি গবেষণা করতে পারি এবং এটি এবং কীভাবে এটি সঠিকভাবে ব্যবহার করতে হয় সে সম্পর্কে আরও জানতে পারি)।
  2. আমি এখানে কি ভুল করেছি? কেন এটি কাজ করে না?

উত্তর:


26

এটি শেলের মধ্যে সম্পন্ন ব্রাস সম্প্রসারণের একটি রূপ । ব্রেস-প্রসারণ ধারণাটি সঠিক, তবে এটি যেভাবে ব্যবহৃত হয়েছিল তা এখানে ভুল। আপনি যখন বোঝাতে চেয়েছিলেন:

systemctl\ {restart,status}\ sshd\;

শেলটি systemctl restart sshd;একটি দীর্ঘ কমান্ড হিসাবে ব্যাখ্যা করে এবং এটি চালানোর চেষ্টা করে এবং এটি চালানোর জন্য এটি কোনও বাইনারি সনাক্ত করতে পারে না। কারণ এই পর্যায়ে, শেলটি আর্গুমেন্ট সহ সম্পূর্ণ কমান্ডটি তৈরি করার আগে কমান্ড লাইনে আইটেমগুলিকে টোকনাইজ করার চেষ্টা করে - তবে এটি এখনও ঘটেনি।

এই জাতীয় পরিচিত সম্প্রসারণ মানগুলির জন্য, আপনি ব্যবহার করতে পারেন evalএবং এখনও নিরাপদ থাকতে পারেন তবে এটি দিয়ে আপনি কী প্রসারিত করার চেষ্টা করছেন তা নিশ্চিত হন।

eval systemctl\ {restart,status}\ sshd\;

তবে আমি forওয়ান-লাইনার ব্যবহার বা ব্যবহার করার পরিবর্তে এর পরিবর্তে একটি লুপ ব্যবহার করব eval:

for action in restart status; do
    systemctl "$action" sshd
done

19

এটিকে বলা হয় বন্ধনী সম্প্রসারণ (ট্যাগটি নির্দেশ করে)।

আমি এখানে কি ভুল করেছি? কেন এটি কাজ করে না?

বাশে একটি কমান্ড লাইন পড়ার এবং সম্পাদনের সাথে জড়িত পর্যায়ে বিবেচনা করুন (উদাহরণস্বরূপ):

  1. একটি লাইন পড়ে
  2. সম্ভাব্য যৌগিক কমান্ডটি উপাদান সহজ কমান্ডগুলিতে পার্স করে
  3. সাধারণ কমান্ডগুলিতে বিভিন্ন বিস্তৃতি ঘটায় (ব্রেস প্রসার, শব্দ বিভাজন, গ্লোববিং ইত্যাদি)
  4. তারপরে সাধারণ কমান্ডগুলি কার্যকর করে (স্বচ্ছতার জন্য বাদ দেওয়া অন্যান্য পর্যায়ে)।

আপনি যা করার চেষ্টা করছেন তা (2) (3) থেকে প্রভাবিত হয়। বিভক্তির ভিত্তিতে বিভাজনটি ;পর্যায়ে রয়েছে (২), যখন এটি যৌগিক আদেশগুলি পার্স করছে। (3) ব্রেস সম্প্রসারণের জন্য ঘটছে ততক্ষণে একটি যৌগিক কমান্ড তৈরি করতে চেষ্টা করতে অনেক দেরি হয়েছে।


6

প্রথম লাইন

echo systemctl\ {restart,status}\ sshd\;

3 টোকেন হিসাবে প্রসারিত করুন

  • প্রতিধ্বনি
  • systemctl পুনঃসূচনা sshd;
  • systemctl স্থিতি sshd;

তারপরে শেষ দুটি টোকন প্রতিধ্বনি করুন এবং এটি ঠিক আছে।

একইভাবে দ্বিতীয় লাইন

systemctl\ {restart,status}\ sshd\;

2 টোকেন হিসাবে প্রসারিত

  • systemctl পুনঃসূচনা sshd;
  • systemctl স্থিতি sshd;

এবং বাশ একটি নির্বাহী systemctl restart sshd;যা এটি খুঁজে পেল না তার সন্ধানের চেষ্টা করুন ।

eval systemctl\ {restart,status}\ sshd\;অপ্রত্যাশিত থেকে সাবধান থাকুন আপনি অন্ধকার দিকে যাত্রা শুরু করতে চান ish


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