কোঁকড়া ধনুর্বন্ধনী সঙ্গে subhell তৈরি বাশ


31

মতে এই , কোঁকড়া ধনুর্বন্ধনী মধ্যে কমান্ডের তালিকা স্থাপন তালিকা বর্তমান শেল প্রেক্ষাপটে নিষ্পন্ন করা হবে কারণ। কোনও সাবশেল তৈরি হয় না

এটি কার্যকরভাবে psদেখতে ব্যবহার করে

কমান্ড লাইনে সরাসরি চালিত প্রক্রিয়া পাইপলাইনের জন্য এটি প্রক্রিয়া শ্রেণিবিন্যাস। 4398 হ'ল লগইন শেলটির পিআইডি:

sleep 2 | ps -H;
  PID TTY          TIME CMD
   4398 pts/23   00:00:00 bash
   29696 pts/23   00:00:00   sleep
   29697 pts/23   00:00:00   ps

এখন কমান্ড লাইনে সরাসরি সম্পাদন করা কোঁকড়ানো ধনুর্বন্ধনীগুলির মধ্যে একটি প্রক্রিয়া পাইপলাইনটির জন্য প্রক্রিয়াক্রমক্রম অনুসরণ করে। 4398 লগইন শেলটির জন্য পিআইডি। এটি উপরের শ্রেণিবিন্যাসের সাথে সমান যা প্রমাণ করে যে বর্তমান শেল প্রসঙ্গে সবকিছু সম্পাদন করা হয় :

{ sleep 2 | ps -H; }
   PID TTY          TIME CMD
    4398 pts/23   00:00:00 bash
    29588 pts/23   00:00:00   sleep
    29589 pts/23   00:00:00   ps

এখন, এই প্রক্রিয়া অনুক্রমের যখন sleepপাইপলাইন নিজে এর ভিতরে কোঁকড়া ধনুর্বন্ধনী স্থাপন করা হয় (সমস্ত মধ্যে ধনুর্বন্ধনী দুই মাত্রা তাই)

{ { sleep 2; } | ps -H; }
  PID TTY          TIME CMD
   4398 pts/23   00:00:00 bash
   29869 pts/23   00:00:00   bash
   29871 pts/23   00:00:00     sleep
   29870 pts/23   00:00:00   ps

তৃতীয় ক্ষেত্রে bashচালানোর জন্য কেন একটি সাবসেল তৈরি করতে হবে sleepযখন ডকুমেন্টেশনে বলা হয় যে কোঁকড়ানো ধনুর্বন্ধনীগুলির মধ্যে কমান্ডগুলি বর্তমান শেল প্রসঙ্গে কার্যকর করা হয়?


আকর্ষণীয়, আমি এটি অনুমান করবো কারণ তৃতীয় ক্ষেত্রে অভ্যন্তরীণ গ্রুপটি পাইপলাইনের একটি অংশ, এবং তাই এটি সাব-শেল উদাহরণস্বরূপ কার্যকর করা হয়েছে, যেমন পাইপলাইনের অংশ হিসাবে অন্য কোনও ফাংশন কল হবে। এটা কি কোন মানে আছে?
মিরোস্লাভ কোকিকার

2
আমি "শেল অবশ্যই" বলব না কারণ এটি হয় ... পাইপলাইনগুলি শেল প্রসঙ্গে কার্যকর করা হয় না । যদি পাইপলাইনে বাহ্যিক কমান্ড ব্যতীত অন্য কিছু থাকে তবে সাব-প্রসেসগুলি তৈরি করা যথেষ্ট। { sleep 2 | command ps -H; }
হউক লেগেছে 18

উত্তর:


26

একটি পাইপলাইনে, সমস্ত কমান্ডগুলি একই সাথে বিভিন্ন পদ্ধতিতে চালিত হয় (তাদের স্টাডাউট / স্টিডিন পাইপ দ্বারা সংযুক্ত করে)।

মধ্যে

cmd1 | cmd2 | cmd3

তিনটি কমান্ডই বিভিন্ন প্রক্রিয়াতে চালিত হয়, তাই তাদের মধ্যে কমপক্ষে দু'জনকে একটি শিশু প্রক্রিয়াতে চালাতে হয়। কিছু শেল বর্তমান শেল প্রসেসের মধ্যে একটি চালায় (যদি অন্তর্নির্মিত readবা পাইপলাইনটি স্ক্রিপ্টের শেষ কমান্ড হয়) তবে bashসেগুলি তাদের নিজস্ব পৃথক প্রক্রিয়াতে চালিত করে ( lastpipeসাম্প্রতিক bashসংস্করণগুলির বিকল্প ছাড়া এবং কিছু নির্দিষ্ট শর্তের অধীনে )।

{...}গ্রুপ কমান্ড। যদি সেই গোষ্ঠীটি পাইপলাইনের অংশ হয়, তবে এটি একটি সাধারণ কমান্ডের মতো পৃথক প্রক্রিয়াতে চলতে হবে।

ইন:

{ a; b "$?"; } | c

এটি মূল্যায়ন করার জন্য আমাদের একটি শেল দরকার যা a; b "$?"এটি একটি পৃথক প্রক্রিয়া, সুতরাং আমাদের একটি সাবশেল দরকার। এই bগোষ্ঠীতে চালানো এটিই শেষ কমান্ডের জন্য খোল না দিয়ে শেলটি অনুকূলিত করতে পারে। কিছু শেল এটি করে তবে দৃশ্যত তা হয় না bash


" তিনটি কমান্ডই বিভিন্ন প্রক্রিয়াতে চালিত হয়, সুতরাং তাদের মধ্যে কমপক্ষে দু'জনকে একটি সাবশেল চালাতে হবে " "কেন এই ক্ষেত্রে সাবসেল প্রয়োজনীয়? পিতামাত শেল গাছের প্রক্রিয়াগুলিকে স্প্যান করতে পারে না? অথবা, যখন আপনি " সাবসেলের মধ্যে চালাতে হবে " বলছেন , আপনি কি শেলটি নিজেই কাঁটাচামচ করবেন এবং তারপরে প্রতিটি সেন্টিমিডি 1 সেমিডি 2 এবং সেমিডি 3 ব্যবহার করবেন? যদি আমি এটি সম্পাদন bash -c "sleep 112345 | cat | cat "করি তবে আমি কেবলমাত্র একটি ব্যাশ তৈরি এবং তারপরে 3 টি শিশুকে অন্য কোনও আন্তঃস্রাবিত সাব বেসগুলি ছাড়াই দেখতে পাচ্ছি।
হাকান বাবা

" ", একটি পৃথক প্রক্রিয়া তাই আমরা একটি subshell প্রয়োজন। $; খ আমরা নির্ণয় করা একটি শেল প্রয়োজন " " ব্যবহার করেও যুক্তি প্রসারিত করতে পারে? এটি বুঝতে আমাদের কেন সাবসিলের দরকার? এটা বুঝতে কী লাগে? আমার ধারণা পার্সিং দরকার তবে আর কী? । পিতামাত শেল কি পার্স করতে পারে না a; b "$?"? সাবসিলের সত্যিকার অর্থে কি মৌলিক প্রয়োজন আছে, বা সম্ভবত এটি কোনও নকশার সিদ্ধান্ত / বাশের প্রয়োগ?
হাকান বাবা

@ হাকানবাবা, আমি সম্ভাব্য বিভ্রান্তি এড়াতে "শিশু প্রক্রিয়া" এ পরিবর্তন করেছি।
স্টাফেন চেজেলাস

1
@ হাকানবাবা, পার্সিংটি প্যারেন্টে করা হয় (কোডটি পড়ে এমন প্রক্রিয়া, সেই কোডটি পাস না করা পর্যন্ত দোভাষীকে মৃত্যুদণ্ড কার্যকর করে eval) তবে মূল্যায়ন (প্রথম কমান্ডটি চালান, এটির জন্য অপেক্ষা করুন, দ্বিতীয়টি চালান) হয় সন্তানের মধ্যে সম্পন্ন, এক যে পাইপ সাথে সংযুক্ত হয়েছে।
স্টাফেন চেজেলাস

মধ্যে { sleep 2 | ps -H; }পিতা বা মাতা ব্যাশ দেখেন sleep 2যে একটি কাঁটাচামচ / Exec প্রয়োজন। কিন্তু { { sleep 2; } | ps -H; }পিতামাতার বাশে { sleep 2; }অন্য শব্দগুলিতে কিছু ব্যাশ কোড দেখায় । দেখে মনে হচ্ছে পিতামাতারা কাঁটাচামচ / এক্সিকিউট পরিচালনা করতে পারেন sleep 2তবে সম্মুখীন ব্যাশ কোডটি হ্যান্ডেল করতে পুনরাবৃত্তভাবে একটি নতুন ব্যাশ তৈরি করে। এটাই আমার বোঝাপড়া, তা কি বোধগম্য?
হাকান বাবা

19

কোঁকড়া ধনুর্বন্ধনী বন্ধনগুলি বোঝায় মনে হয় যে আপনি স্কোপিংয়ের একটি অতিরিক্ত স্তর তৈরি করছেন যার জন্য একটি নতুন সাব-শেলটি চাওয়া দরকার। আপনি আপনার ps -Hআউটপুটে বাশের অনুলিপি 2 copy অনুলিপি দ্বারা এই প্রভাব দেখতে পারেন ।

প্রথম স্তরের কোঁকড়া ধনুর্বন্ধনী কেবলমাত্র প্রক্রিয়াগুলি আসল বাশ শেলের আওতায় চলে। যে কোনও নেস্টেড কোঁকড়ানো ধনুর্বন্ধনী তাদের নিজস্ব স্কোপড বাশ শেলের মধ্যে চলবে।

উদাহরণ

$ { { { sleep 20; } | sleep 20; } | ps -H; }
  PID TTY          TIME CMD
29190 pts/1    00:00:00 bash
 5012 pts/1    00:00:00   bash
 5014 pts/1    00:00:00     bash
 5016 pts/1    00:00:00       sleep
 5015 pts/1    00:00:00     sleep
 5013 pts/1    00:00:00   ps

টেকিং | ps -Hমিশ্রণ থেকে বের যাতে আমরা নেস্টেড কোঁকড়া ধনুর্বন্ধনী দেখতে পারেন, আমরা চালাতে পারেন ps auxf | lessঅন্য শেল হবে।

saml     29190  0.0  0.0 117056  3004 pts/1    Ss   13:39   0:00  \_ bash
saml      5191  0.0  0.0 117056  2336 pts/1    S+   14:42   0:00  |   \_ bash
saml      5193  0.0  0.0 107892   512 pts/1    S+   14:42   0:00  |   |   \_ sleep 20
saml      5192  0.0  0.0 107892   508 pts/1    S+   14:42   0:00  |   \_ sleep 20
saml      5068  0.2  0.0 116824  3416 pts/6    Ss   14:42   0:00  \_ bash
saml      5195  0.0  0.0 115020  1272 pts/6    R+   14:42   0:00      \_ ps auxf
saml      5196  0.0  0.0 110244   880 pts/6    S+   14:42   0:00      \_ less

তবে অপেক্ষা করুন আরও আছে!

আপনি যদি পাইপগুলি বাইরে বের করেন এবং কোনও কমান্ডের এই ফর্মটি ব্যবহার করেন তবে আমরা বাস্তবে কী প্রত্যাশা করব তা আমরা দেখতে পাই:

$ { { { sleep 10; } ; { sleep 10; } ; sleep 10; } } | watch "ps -H"

এখন ফলাফল ওয়াচ উইন্ডোতে আমরা কী ঘটছে তার প্রতি 2 সেকেন্ডে একটি আপডেট পাই:

এখানে প্রথম sleep 10:

  PID TTY          TIME CMD
29190 pts/1    00:00:00 bash
 5676 pts/1    00:00:00   bash
 5678 pts/1    00:00:00     sleep
 5677 pts/1    00:00:00   watch
 5681 pts/1    00:00:00     watch
 5682 pts/1    00:00:00       ps

দ্বিতীয়টি এখানে sleep 10:

  PID TTY          TIME CMD
29190 pts/1    00:00:00 bash
 5676 pts/1    00:00:00   bash
 5691 pts/1    00:00:00     sleep
 5677 pts/1    00:00:00   watch
 5694 pts/1    00:00:00     watch
 5695 pts/1    00:00:00       ps

তৃতীয়টি এখানে sleep 10:

  PID TTY          TIME CMD
29190 pts/1    00:00:00 bash
 5676 pts/1    00:00:00   bash
 5704 pts/1    00:00:00     sleep
 5677 pts/1    00:00:00   watch
 5710 pts/1    00:00:00     watch
 5711 pts/1    00:00:00       ps

তিনটি ঘুম খেয়াল করুন যদিও বিভিন্ন কোঁকড়ানো ধনুর্বন্ধনী স্তরের স্তরে স্তরে স্তরে ধনুযুক্ত ধনুর্বন্ধনী স্তরে ধীরে ধীরে থাকছে বাশের পিআইডি 566 এর মধ্যেই বাস্তবে থাকতে পারে। সুতরাং আমি বিশ্বাস করি যে আপনার সমস্যাটি ব্যবহারে স্বয়ং ক্ষতিগ্রস্থ হয়েছে | ps -H

উপসংহার

ব্যবহারের | ps -H(অর্থাত পাইপ) একটি অতিরিক্ত উপ-শেল হয় যার ফলে, যাতে পদ্ধতি ব্যবহার করবেন না যখন জিজ্ঞাসাবাদ করা কী হচ্ছে প্রয়াস।


সুতরাং, "প্রথম স্তরের কোঁকড়া ধনুর্বন্ধনীগুলির মধ্যে কেবলমাত্র প্রক্রিয়াগুলি আসল বাশ শেলের আওতায় চলে" "
এক্সিলিটস

@ এক্সিলিটস - আপনি কি আমাকে জিজ্ঞাসা করছেন এমন একটি ফলোআপ কি?
slm

@ এসএমএল এটি উত্তরের মূল বিষয়টির উপরে জোর দেওয়া, যেমনটি আমি এটি দেখেছি। কার্ল ব্রেসগুলির প্রথম স্তরের কমান্ডগুলি বর্তমান শেলটিতে চালিত হয়, নেস্টেড কোঁকড়া ধনুর্বন্ধনীগুলি নতুন শেল তৈরি করে। প্রথম স্তরে, প্যারেন্টিগুলি এখনই সাব-শেল তৈরিতে পৃথক। যদি আমার এটি ভুল হয়ে থাকে - আমাকে সংশোধন করুন। তবে অন্যরা ইঙ্গিত হিসাবে, প্রাথমিক প্রশ্নের পাইপলাইনও রয়েছে। এইভাবে পৃথক প্রক্রিয়া তৈরি। এবং কোঁকড়া ধনুর্বন্ধনী পৃথক প্রক্রিয়া ব্যবহার করার জন্য একটি শেল তৈরি করতে হবে। সুতরাং, সম্ভবত, এটি প্রশ্নে আচরণের কারণ।
এক্সিলিটস

এখন, আপনার পোস্টটি পড়ার পরে, আমি দেখতে পাচ্ছি যে আমি ভুল ছিল the নেস্টিং স্টেটমেন্টটি কেবল পাইপলাইনগুলির সাথে সম্পর্কিত। সুতরাং, কোঁকড়া ধনুর্বন্ধনী কখনও নতুন শেল তৈরি করে না, যদি না আপনি তাদের সাথে একটি পৃথক প্রক্রিয়া গুটিয়ে রাখেন - তবে সেগুলি করতে হবে।
এক্সিলিটস

@ এক্সিলিট - এটি সঠিক।
slm

7

আমি আমার পরীক্ষার ফলাফল পোস্ট করব, যা আমাকে এই সিদ্ধান্তে পৌঁছে দিয়েছে যে বাশ একটি গ্রুপ কমান্ডের জন্য একটি সাব-শেল তৈরি করে যদি এবং কেবল যদি এটি পাইপলাইনের একটি অংশ হয় তবে এটি একই রকম হয় যে কেউ কোনও ফাংশন কল করবে যা ডাকাও হবে সাব-শেল ইন

$ { A=1; { A=2; sleep 2; } ; echo $A; }
2

$ { A=1; { A=2; sleep 2; } | sleep 1; echo $A; }
1

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