क्या bash C के कांटे () के समान होने का समर्थन करता है?


25

मेरे पास एक स्क्रिप्ट है जिसे मैं एक बिंदु पर कांटा करना चाहूंगा, इसलिए एक ही स्क्रिप्ट की दो प्रतियां चल रही हैं।

उदाहरण के लिए, मैं निम्नलिखित बैश स्क्रिप्ट को मौजूद करना चाहूंगा:

echo $$
do_fork()
echo $$

यदि यह बैश स्क्रिप्ट सही मायने में अस्तित्व में है, तो अपेक्षित आउटपुट होगा:

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

या

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

क्या ऐसा कुछ है जो मैं इस तरह के आउटपुट को प्राप्त करने के लिए "do_fork ()" के स्थान पर रख सकता हूं, या bash स्क्रिप्ट को C-like fork करने का कारण बना सकता हूं?

जवाबों:


23

हाँ। फोर्किंग वर्तनी है &:

echo child & echo parent

जो आपको भ्रमित कर सकता है वह $$यह है कि शेल प्रक्रिया का PID नहीं है, यह मूल शेल प्रक्रिया का PID है। इसे इस तरह बनाने की बात यह है कि $$शेल स्क्रिप्ट के किसी विशेष उदाहरण के लिए एक विशिष्ट पहचानकर्ता है: यह स्क्रिप्ट के निष्पादन के दौरान नहीं बदलता है, और यह $$किसी भी अन्य समवर्ती रूप से चलने वाली स्क्रिप्ट से अलग है । शेल प्रक्रिया को वास्तविक PID प्राप्त करने का एक तरीका है sh -c 'echo $PPID'

शेल में नियंत्रण प्रवाह C के समान नहीं है। यदि C में आप लिखेंगे

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

फिर एक शेल समतुल्य है

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

साधारण शेल फॉर्म first; child & parentसामान्य सी मुहावरे से मेल खाता है

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

&और $$मौजूद है और हर बॉर्न-शैली शेल और (टी) csh में इस तरह से व्यवहार करता है। $PPIDओरिगनल बॉर्न शेल में मौजूद नहीं था, लेकिन पोसिक्स में है (इसलिए यह राख, बाश, क्श, ज़श, ...) में है।


3
लेकिन यह मूल रूप से "कांटा + निष्पादन" है, न कि केवल कांटा।
Mattdm

@mattdm: उह? &कांटा है, कोई निष्पादन शामिल नहीं है। कांटा + निष्पादन जब आप एक बाहरी कमांड लॉन्च करते हैं।
गिल्स एसओ- बुराई को रोकें '

@mattdm: आह, मुझे लगता है कि मैं देखता हूं कि Cory में क्या हो रहा है। कोई नहीं है exec, लेकिन दोनों भाषाओं में अलग-अलग नियंत्रण प्रवाह है।
गिल्स एसओ- बुराई को रोकें '

1
@ गिल्स: बैश कंट्रोल ऑपरेटर &एक सबमिशन शुरू करता है जिसमें दिए गए कमांड को निष्पादित किया जाता है। कांटा + निष्पादित। आप बस &निष्पादित करने के लिए कोई पूर्ववर्ती आदेश के साथ नहीं डाल सकते ।
Mattdm

5
ठीक है, अगर "फोर्किंग वर्तनी है और" एक सच्चा कथन था, तो आप &स्वयं ही एक पंक्ति में रख सकते हैं । लेकिन आप नहीं कर सकते। इसका मतलब यह नहीं है "यहाँ कांटा"। इसका मतलब है "एक उपधारा में पृष्ठभूमि में पूर्ववर्ती कमांड निष्पादित करें"।
mattdm

10

हाँ, इसे उप-खंड कहा जाता है । कोष्ठक के अंदर शैल कोड एक उपखंड (कांटा) के रूप में चलाया जाता है। हालाँकि पहला खोल आमतौर पर बच्चे के पूरा होने की प्रतीक्षा करता है। आप &टर्मिनेटर का उपयोग करके इसे अतुल्यकालिक बना सकते हैं । इसे एक्शन में कुछ इस तरह से देखें:

#!/bin/bash

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

$ बश सबह.श


5
कोष्ठक एक उपधारा बनाते हैं, लेकिन यह कांटा + प्रतीक्षा है। &अकेले कांटा है। यदि आप बच्चे की प्रक्रिया में एक से अधिक पाइपलाइन को निष्पादित करना चाहते हैं, तो यह ब्रेसिज़ का उपयोग करने के लिए पर्याप्त है (जो कि बच्चे की प्रक्रिया बनाए बिना समूहन का प्रदर्शन करते हैं):{ sleep 2; echo child; } &
गाइल्स का SO- बुराई होना बंद हो '

6

ऐसा करने के लिए कोई देशी बैश (या, मेरी जानकारी के लिए, कोई अन्य विशिष्ट * निक्स खोल) नहीं है। कांटे की प्रक्रियाओं को फैलाने के कई तरीके हैं जो कुछ और असिंक्रोनस तरीके से करते हैं, लेकिन मुझे नहीं लगता कि फोर्क () सिस्टम कॉल के सटीक शब्दार्थों का पालन होता है।

सामान्य दृष्टिकोण यह होगा कि आपके शीर्ष स्तर की लिपि सहायकों को अलग कर दे, जो आपके द्वारा विभाजित किए जाने वाले कार्य को करना चाहते हैं। यदि आप करते हैं $0 $@ &या जो भी हो, आप शुरुआत में फिर से शुरू करेंगे और किसी भी तरह से यह पता लगाने की आवश्यकता होगी।

मैं वास्तव में कई चालाक तरीकों के बारे में सोचना शुरू कर रहा हूं जिसमें कोई भी ऐसा कर सकता है ...।

लेकिन , इससे पहले कि मेरा मस्तिष्क भी इससे दूर हो जाए, मुझे लगता है कि एक बहुत अच्छा नियम है: यदि आप शेल में कुछ लिखने की कोशिश कर रहे हैं और यह चालाक चाल से भरा हो रहा है और आप अधिक भाषा सुविधाओं, स्विच करने का समय चाहते हैं एक वास्तविक प्रोग्रामिंग भाषा के लिए


2
हालाँकि आपकी बात अच्छी तरह से ली गई है- बैश का सिंटैक्स यकीनन मुश्किल है और यह पर्ल या पायथन के अधिक सुरुचिपूर्ण डेटा संरचनाओं और विशेषताओं को याद कर रहा है, बैश असली है जैसा कि अपने डोमेन में मिलता है । यह एक डोमेन-विशिष्ट भाषा है, और मैं कई उदाहरणों में पायथन से भी बेहतर (अधिक रसीला, सरल) तर्क दूंगा। क्या आप एक कमरे के सिस्टम का पता लगा सकते हैं और पायथन को नहीं जानते हैं हाँ। क्या आप ऐसा कर सकते हैं और मार [प्रोग्रामिंग] की चाट नहीं जानते हैं? मैं कोशिश नहीं करना चाहता। 30 साल की शेल प्रोग्रामिंग के बाद, मैं आपको बताता हूं कि यह उतना ही वास्तविक है जितना इसे मिलता है। और हां, मैं पायथन बोलता हूं। लेकिन युवाओं को भ्रमित न करें।
माइक एस

2
उस ने कहा, तकनीकी रूप से मुझे यह उत्तर अधिक पसंद है। यह कहना कि "&" उपयोगकर्ता के प्रश्न का उत्तर है, "एक बिंदु पर कांटा तो एक ही स्क्रिप्ट की दो प्रतियां चल रही हैं" मेरे दिमाग को भ्रमित करने के लिए है। बैश मैनुअल के अनुसार "और" करता है, "... एक उपधारा में पृष्ठभूमि में [दिए गए] कमांड को निष्पादित करता है।" इसे एक कमांड को समाप्त करना होगा, और इसमें एक कांटा (तकनीकी रूप से, लिनक्स में, एक क्लोन ()) शामिल है, लेकिन उस बिंदु पर एक ही स्क्रिप्ट की दो प्रतियां नहीं चल रही हैं।
माइक एस
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.