2013-06-01 8 views
8

सारांश: मेरे पास एक बैश स्क्रिप्ट है जो पृष्ठभूमि में एक प्रक्रिया चलाती है, और इसे सामान्य कमांड के रूप में और कमांड प्रतिस्थापन ब्लॉक के अंदर काम करना चाहिए $(...) के रूप में। स्क्रिप्ट स्वयं एक ऐसी प्रक्रिया को जन्म देती है जो पृष्ठभूमि में फोर्क करती है। यह इस परीक्षण का मामला करने के लिए कम किया जा सकता है:

#!/bin/sh 
echo something 
sleep 5 & 

एक खोल में इस स्क्रिप्ट चल रहा है तुरंत वापस आ जाएगी (और प्रिंट "कुछ"), यह $(...) अंदर चल रहा है 5 सेकंड के लिए रखती हूँ, backgrounded "नींद" के लिए इंतजार खत्म करने के लिए।

कमांड प्रतिस्थापन खोल और पृष्ठभूमि में स्पॉन्स प्रक्रियाओं के अंदर शुरू की गई किसी भी चीज़ पर लागू होता है, जिसमें उस प्रक्रिया पेड़ में किसी भी बच्चे को स्पष्ट रूप से शामिल किया गया है। लगता है कि दोनों बाश और zsh को प्रभावित करने के लिए, दूसरों की कोशिश नहीं की है।


मूल प्रश्न: मैं एक bash स्क्रिप्ट है कि हर बार इसे चलाता stdout के लिए एक मूल्य मुद्रित करने के लिए माना जाता है और यह भी एक्स क्लिपबोर्ड पर प्रतिलिपि की है।

$ something 
something 
$ xclip -o -selection clipboard 
something 
$ echo $(something) 
^C 
:

#!/bin/sh 
echo something 
echo something | xclip -selection clipboard 

यह स्क्रिप्ट (यह कॉल "कुछ") इस शब्द (जो वास्तव में एक और आदेश का आउटपुट है) प्राप्त करने के लिए प्रयोग की जाने वाली है और इस तरह के रूप में अलग अलग तरीकों से इस्तेमाल किया जा मतलब है

सामान्य स्टडआउट पर प्रिंट, आउटपुट को सामान्य एक्स अनुप्रयोगों में उपयोग करने के लिए क्लिपबोर्ड पर प्रतिलिपि बनाता है, और इस शब्द को किसी भी कमांड के बीच में डालने के लिए बाश कमांड प्रतिस्थापन के साथ stdout का उपयोग करने में सक्षम होना चाहिए।

हालांकि बैश कमांड प्रतिस्थापन xclip को अग्रभूमि में जीवित रहने के लिए मजबूर करता है। xclip आमतौर पर X क्लिपबोर्ड की आवश्यकता होती है क्योंकि क्लाइंट क्लिपबोर्ड सामग्री प्रदान करता है, और डिफ़ॉल्ट व्यवहार क्लिपबोर्ड सामग्री को प्रतिस्थापित करने के बाद इसे छोड़ना है।

xclip मैं कम से कम परीक्षण का मामला है कि मैं इस सवाल की शुरुआत में लेखन की वजह से साथ इस मुद्दे पर होने के बाद, तो यह है कि कुछ भी है कि $(...) खोल अंदर daemonizes

किसी को भी इस व्यवहार की व्याख्या कर सकते लागू करने के लिए लगता है? क्या कोई रास्ता है जिससे मैं इससे बच सकता हूं?

उत्तर

12

यदि आप पृष्ठभूमि प्रक्रिया को कमांड प्रतिस्थापन में हस्तक्षेप नहीं करना चाहते हैं, तो आपको इसके स्टडआउट को डिस्कनेक्ट करना होगा। यह तुरंत वापस आ जाएगी:

$ cat bg.sh 
#!/bin/sh 
echo before 
sleep 5 >/dev/null & 
echo after 
$ date; x=$(./bg.sh); date; echo "$x" 
Sat Jun 1 13:02:26 EDT 2013 
Sat Jun 1 13:02:26 EDT 2013 
before 
after 

आप backgrounded प्रक्रिया के stdout पर कब्जा करने की क्षमता खो देंगे, लेकिन अगर आप इसे पृष्ठभूमि में चला रहे हैं तो आप शायद परवाह नहीं है। bg.sh प्रक्रिया हमेशा डिस्क पर लिख सकती है।

+0

वू! सही और अत्यंत सरल समाधान। धन्यवाद! – dequis

+0

वैसे,/dev/null की बजाय किसी फ़ाइल पर रीडायरेक्ट करना आउटपुट को कैप्चर करने के लिए काम करता है, लेकिन कम से कम यहां, आउटपुट फ़ाइल पृष्ठभूमि प्रक्रिया से बाहर निकलने के बाद ही अपडेट हो जाती है। (मुझे इसके लिए इसकी आवश्यकता नहीं है, हालांकि) – dequis

संबंधित मुद्दे