पृष्ठभूमि प्रक्रिया पाइप-इनपुट


14

अगर मैं स्क्रीन पर "आआ" प्रदर्शित करना चाहता हूं:

(1)$: echo aaa | cat                 ... works OK
(2)$: echo aaa | ( cat )             ... works OK
(3)$: echo aaa | ( cat & )           ... NOT working
(4)$: ( echo aaa & ) | cat           ... works OK 
(5)$: echo aaa | ( cat <&0 & )       ... works ok in BASH (but not in SH)
(6)$: echo aaa | ( cat <&3 & ) 3<&0  ... works ok in BASH and SH

(3) और (4) -> अलग प्रक्रिया से शामिल होने के बाद भी जुड़ा हुआ आउटपुट है जिसे नियंत्रित किया जा सकता है, उपयोग किया जा सकता है, पुनर्निर्देशित किया जा सकता है ... लेकिन इनपुट नहीं!

मेरा सवाल है: क्या कोई समझता है कि क्यों और कैसे (5) काम करता है ???

... "<और 0" "0 <& 0" के लिए छोटा है, क्यों 0 से 0 को पुनर्निर्देशित करना समाधान है, और वास्तव में अलग प्रक्रिया के इनपुट के साथ पीछे क्या होता है। सब्सक्रिप्शन की समस्या नहीं है, इसके बजाय (...) के ब्रेसिज़ {...} का उपयोग करके समान परिणाम प्रदान करते हैं।

... और प्रश्न 2: क्या लाइन (6) की तुलना में "अलग प्रक्रिया के लिए इनपुट देने" के लिए बेहतर समाधान है।

जवाबों:


12

हाँ, POSIX द्वारा आवश्यक के रूप में , &उनके मानक इनपुट के साथ पृष्ठभूमि से शुरू किए गए आदेशों को फिर से निर्देशित किया गया है /dev/null

और सचमुच में

{ cmd <&3 3<&- & } 3<&0

इसके आसपास काम करने का सबसे स्पष्ट तरीका है।

यह स्पष्ट नहीं है कि आप पृष्ठभूमि में पाइपलाइन का हिस्सा क्यों चलाना चाहते हैं।


कारण पाइप श्रृंखला (cmd1 | {cmd2 &; pid2 = $!!}}} cmd3 के अंदर एक विशिष्ट कमांड की PID प्राप्त करना था, इसलिए / dev / null == & 0 BG proces के लिए मानक है, क्या आप भी जानते हैं कि क्यों? "<<और 0" बैश में काम करता है ... और क्या यह सुरक्षित है?
असैन कुजोविक

3
@OmerMerdan POSIX का कहना है कि सभी मामलों में, मानक इनपुट के स्पष्ट पुनर्निर्देशन से इस गतिविधि को रोक दिया जाएगा , जो किसी भी तरह से इसके ऊपर कहा गया है, इसलिए मेरा मानना ​​है कि bashयह व्याख्या करता है (और यह एक उचित व्याख्या की तरह लगता है) /dev/nullपुनर्निर्देशन को रद्द करता है। अब, नहीं कई गोले एक ही करते हैं। ऐश और pdksh नहीं है।
स्टीफन चेजलस

यह क्यों 3<&-आवश्यक है और क्या इसका उपयोग करने के लिए सुरक्षित है (क्या यह पूर्ण इनपुट आईआर पढ़ने से पहले पाइप को बंद नहीं करेगा)?
मावेरेसेक

1
@ मोरिसेक, कि fd 3 का उपयोग केवल मूल स्टैड को पुनर्स्थापित करने के लिए अस्थायी रूप से किया जाता है। हम इसे बंद कर देते हैं क्योंकि cmdइसकी आवश्यकता नहीं है। इसे बंद करने के बाद हमने इसे fd 0 ( <&3छोटे के लिए 0<&3) पर जोड़ दिया है ।
स्टीफन चेज़लस

1
@Mvorisek, nohupstdin को / dev / null में भी रीडायरेक्ट करता है, इसलिए आपको इसकी आवश्यकता होगी { nohup sh -c 'cmd <&3 3<&-' & } 3<&0:। या(trap '' HUP; cmd <&3 3<&- > nohup.out 2>&1 &) 3<&0
स्टीफन चेज़लस
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.