বাশ কি সি এর কাঁটাচামচ () এর অনুরূপ কাঁটাচামচ সমর্থন করে?


25

আমার কাছে একটি স্ক্রিপ্ট রয়েছে যা আমি এক পর্যায়ে কাঁটাচামচ করতে চাই যাতে একই স্ক্রিপ্টের দুটি অনুলিপি চলছে।

উদাহরণস্বরূপ, আমি নিম্নলিখিত বাশ স্ক্রিপ্টটি উপস্থিত থাকতে চাই:

echo $$
do_fork()
echo $$

যদি এই বাশ স্ক্রিপ্টটি সত্যই বিদ্যমান থাকে তবে প্রত্যাশিত আউটপুটটি হবে:

<ProcessA PID>
<ProcessB PID>
<ProcessA PID>

অথবা

<ProcessA PID>
<ProcessA PID>
<ProcessB PID>

এই জাতীয় আউটপুট পেতে, বা বাশ স্ক্রিপ্টকে সি-এর মতো কাঁটাচামচ করার জন্য কি এমন কিছু আছে যা আমি "do_fork ()" এর জায়গায় রাখতে পারি?

উত্তর:


23

হ্যাঁ। কাঁটা বানান বানান &:

echo child & echo parent

যা আপনাকে বিভ্রান্ত করতে পারে তা $$হ'ল এটি শেল প্রক্রিয়ার পিআইডি নয়, এটি মূল শেল প্রক্রিয়ার পিআইডি । এটি এইভাবে তৈরি করার বিষয়টি হ'ল $$শেল স্ক্রিপ্টের একটি নির্দিষ্ট উদাহরণের জন্য এটি একটি অনন্য সনাক্তকারী: এটি স্ক্রিপ্টটির সম্পাদনার সময় পরিবর্তন হয় না এবং এটি $$অন্য কোনও একযোগে চলমান স্ক্রিপ্ট থেকে পৃথক। শেল প্রক্রিয়াটির আসল পিআইডি পাওয়ার একটি উপায় sh -c 'echo $PPID'

শেলের নিয়ন্ত্রণ প্রবাহ সি এর মতো হয় না যদি সি হয় আপনি লিখতে চান

first(); fork(); second(); third();

তারপর একটি শেল সমতুল্য হয়

after_fork () { second; third; }
first; after_fork & after_fork

সাধারণ শেল ফর্মটি first; child & parentসাধারণ সি আইডিয়ামের সাথে মিলে যায়

first(); if (fork()) parent(); else child();

&এবং $$প্রতিটি বোর্ন-স্টাইলের শেল এবং (টি) সিএসএসে এইভাবে উপস্থিত এবং আচরণ করুন। $PPIDঅরিগনাল বোর্ন শেলটিতে উপস্থিত ছিল না তবে পসিক্সে রয়েছে (সুতরাং এটি ছাই, বাশ, কেশ, জেডএস,…)।


3
তবে এটি মূলত "কাঁটাচামচ + এক্সিকিউট", কেবল কাঁটাচামচ নয়।
ম্যাটডেম

@ ম্যাটডেম: আহ? &কাঁটাচামচ, কোনও এক্সিকিউট জড়িত নেই। আপনি যখন একটি বাহ্যিক কমান্ড চালু করেন তখন কাঁটাচামচ + এক্সিকিউট হয়।
গিলস 'অশুভ হওয়া বন্ধ করুন'

@ মেট্টেম: আহ, আমি মনে করি আমি দেখছি কোরি কী পেলছে। নেই exec, তবে দুটি ভাষার পৃথক নিয়ন্ত্রণ প্রবাহ রয়েছে।
গিলস 'অশুভ হওয়া বন্ধ করুন'

1
@ গিলস: ব্যাশ কন্ট্রোল অপারেটর &একটি সাবশেল শুরু করে যেখানে প্রদত্ত আদেশটি কার্যকর করা হয়। কাঁটাচামচ + এক্সিকিউটিভ &এক্সিকিউট করার জন্য আপনি পূর্বের কোনও কমান্ড না দিয়েই রাখতে পারবেন না ।
ম্যাটডেম

5
আচ্ছা, যদি "ফোর্কিংয়ের বানান থাকে &" সত্য বিবৃতি হয়ে থাকে তবে আপনি &নিজেই একটি লাইনে দাঁড়াতে পারতেন । কিন্তু আপনি পারবেন না। এর অর্থ এখানে "কাঁটাচামচ" নয়। এর অর্থ "সাবসিলে পটভূমিতে পূর্ববর্তী কমান্ডটি কার্যকর করুন"।
ম্যাচটিএম

10

হ্যাঁ, এটিকে সাবসেল বলা হয় । প্রথম বন্ধকের অভ্যন্তরে শেল কোডটি সাব-শেল (কাঁটাচামচ) হিসাবে চালিত হয়। তবে প্রথম শেলটি সাধারণত শিশুটি শেষ হওয়ার জন্য অপেক্ষা করে। আপনি এটি &টার্মিনেটর ব্যবহার করে অ্যাসিক্রোনাস করতে পারেন । এটি এর মতো কিছু সহ ক্রিয়াতে দেখুন:

#!/bin/bash

(sleep 2; echo "subsh 1")&
echo "topsh"

ash bash subsh.sh


5
প্রথম বন্ধনীগুলি একটি সাব-শেল তৈরি করে তবে এটি কাঁটাচামচ + অপেক্ষা। &একা কাঁটাচামচ। আপনি যদি শিশু প্রসেসে একাধিক পাইপলাইন কার্যকর করতে চান তবে এটি বন্ধনী ব্যবহার করা যথেষ্ট (যা একটি শিশু প্রক্রিয়া তৈরি না করে গ্রুপিং সম্পাদন করে):{ sleep 2; echo child; } &
গিলস

6

এটি করার কোনও নেটিভ বাশ (বা, আমার জ্ঞান অনুসারে, অন্য কোনও আদর্শ * নিক্স শেল) নেই। কাঁটাচামচ প্রক্রিয়াগুলি অবিচ্ছিন্নভাবে অন্য কিছু করার জন্য প্রচুর উপায় রয়েছে, তবে আমি মনে করি না কাঁটাচামচ () সিস্টেম কলের সঠিক শব্দার্থবিজ্ঞানের অনুসরণ করে এমন কিছু রয়েছে।

সাধারণ পন্থাটি হ'ল আপনার শীর্ষ-স্তরের স্ক্রিপ্টটি সাহায্যকারীদের বন্ধ করে দেওয়া হবে যা আপনি বিচ্ছিন্ন করতে চান এমন কাজ করে। আপনি যদি $0 $@ &বা যাই করেন না কেন, আপনি আবার শুরুতে শুরু করবেন এবং এটি কোনওভাবে খুঁজে বের করতে হবে।

আমি আসলে বেশ কয়েকটি চালাক উপায় নিয়ে ভাবতে শুরু করি যার মাধ্যমে কেউ কেবল এটি করতে পারে ....

তবে , আমার মস্তিষ্কটি এটি থেকে দূরে সরে যাওয়ার আগে, আমি মনে করি একটি দুর্দান্ত নিয়ম হ'ল: আপনি যদি শেলটিতে কিছু লেখার চেষ্টা করছেন এবং এটি চতুর কৌশল দ্বারা পূর্ণ হয়ে উঠছে এবং আপনি আরও ভাষা বৈশিষ্ট্যের জন্য চান, সময় পরিবর্তন করার জন্য একটি বাস্তব প্রোগ্রামিং ভাষা


2
যদিও আপনার বক্তব্যটি যথাযথভাবে নেওয়া হয়েছে - বাশের সিনট্যাক্সটি তর্কযোগ্যভাবে কঠিন এবং এটি পার্ল বা পাইথনের আরও মার্জিত ডেটা স্ট্রাকচার এবং বৈশিষ্ট্যগুলি হারিয়েছে, বাশ যত তাড়াতাড়ি বাস্তব হিসাবে আসবে - এর ডোমেনে । এটি একটি ডোমেন-সুনির্দিষ্ট ভাষা এবং আমি উদাহরণ হিসাবে পাইথনের তুলনায় আরও ভাল (আরও সংহত, সহজ) তর্ক করব। আপনি কি বেশ কয়েকটি সিস্টেম পরিচালনা করতে পারবেন এবং পাইথন জানেন না? হ্যাঁ। আপনি কি তা করতে পারেন এবং ব্যাশ [প্রোগ্রামিং] এর এক চাটা জানেন না? আমি চেষ্টা করতে চাই না। শেল প্রোগ্রামিংয়ের 30 বছর পরে আমি আপনাকে বলি এটি যতটা বাস্তব তা আসল। এবং হ্যাঁ, আমি পাইথন কথা বলি। তবে তরুণদের গুলিয়ে ফেলবেন না।
মাইক এস

2
এটি বলেছিল, প্রযুক্তিগতভাবে আমি এই উত্তরটি আরও পছন্দ করি। "এবং" ব্যবহারকারীর প্রশ্নের জবাব, "এক পর্যায়ে কাঁটাচামচ তাই একই স্ক্রিপ্টের দুটি অনুলিপি চলছে" তা আমার মনে বিভ্রান্ত করছে। বাশ ম্যানুয়াল অনুসারে "&" যা করে, তা হ'ল "... একটি সাবশেলের পটভূমিতে [প্রদত্ত] কমান্ড কার্যকর করে।" এটি অবশ্যই একটি কমান্ড সমাপ্ত করবে, এবং এতে একটি কাঁটাচামচ জড়িত (প্রযুক্তিগতভাবে, লিনাক্সে, একটি ক্লোন ()) রয়েছে তবে সেই সময়ে একই স্ক্রিপ্টের দুটি অনুলিপি চলমান নেই।
মাইক এস
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.