2013-03-25 13 views
14

मैं बैश शुरुआती हूं लेकिन मैं इस उपकरण को कंप्यूटर में नौकरी पाने के लिए सीखने की कोशिश कर रहा हूं।बैश: फ़ाइल डिस्क्रिप्टर

मैं अब फ़ाइल डिस्क्रिप्टर के बारे में खुद को पढ़ाने की कोशिश कर रहा हूं।


#!/bin/bash 

# Some dummy multi-line content 
read -d '' colours <<- 'EOF' 
     red 
     green 
     blue 
EOF 

# File descriptor 3 produces colours 
exec 3< <(echo "$colours") 

# File descriptor 4 filters colours 
exec 4> >(grep --color=never green) 

# File descriptor 5 is an unlimited supply of violet 
exec 5< <(yes violet) 

echo Reading colours from file descriptor 3... 
cat <&3 
echo ... done. 

echo Reading colours from file descriptor 3 again... 
cat <&3 
echo ... done. 

echo Filtering colours through file descriptor 4... 
echo "$colours" >&4 
echo ... done. # Race condition? 

echo Dipping into some violet... 
head <&5 
echo ... done. 

echo Dipping into some more violet... 
head <&5 
echo ... done. 

कुछ सवाल वसंत मन में के रूप में मैं उत्पादन ऊपर से आ रही देखें::

  1. fd3 के बाद "समाप्त" करने के लिए लगता है मुझे मेरे प्रयोगों में से कुछ साझा करते हैं "खपत", क्या यह पहले उपयोग के बाद भी स्वचालित रूप से बंद हो जाता है?
  2. नामित पाइप से fd3 अलग कैसे है? (कुछ मैंने पहले ही देखा है)
  3. जब बिल्कुल कमांड yes निष्पादन शुरू करता है? एफडी घोषणा पर? बाद में?
  4. yes स्टॉप (CTRL-Z या अन्य) और अधिक बैंगनी की आवश्यकता होने पर पुनरारंभ करें?
  5. मैं yes का पीआईडी ​​कैसे प्राप्त कर सकता हूं?
  6. क्या मुझे "सक्रिय" एफडीएस की सूची मिल सकती है?
  7. एफडी 4 के माध्यम से फ़िल्टर करने पर बहुत ही रोचक दौड़ की स्थिति, क्या इससे बचा जा सकता है?
  8. yes केवल exec 5>&- पर रुक जाएगा?
  9. इससे कोई फर्क नहीं पड़ता कि मैं >&- या <&- के साथ बंद करता हूं?

मैं अभी यहां रुक जाऊंगा।

धन्यवाद!

पुनश्च: आंशिक (गिने) जवाब ठीक हैं .. मैं एक साथ विभिन्न बिट और टुकड़े डाल देता हूँ अपने आप को .. (हालांकि एक भी व्यक्ति से एक व्यापक जवाब प्रभावशाली होगा!)

उत्तर

13

fd3 लगता है "खपत" के बाद "समाप्त" पाने के लिए, क्या यह पहले उपयोग के बाद भी स्वचालित रूप से बंद हो जाता है?

नहीं, यह बंद नहीं है। यह exec काम के कारण है। उस मोड में जिसमें आपने exec (तर्क के बिना) का उपयोग किया है, इसका कार्य शैल के स्वयं के फ़ाइल डिस्क्रिप्टरों को व्यवस्थित करना है, जैसा कि स्वयं को निर्दिष्ट I/O पुनर्निर्देशन द्वारा अनुरोध किया गया है, और फिर उन्हें स्क्रिप्ट समाप्त होने तक छोड़ दें या वे बाद में बदल दिया गया है।

बाद में, cat इस फ़ाइल डिस्क्रिप्टर 3 की अपनी मानक इनपुट (फ़ाइल डिस्क्रिप्टर 0) पर एक प्रति प्राप्त करता है। cat का मानक इनपुट तत्काल बंद है जब cat बाहर निकलता है (या शायद, हालांकि, cat मौजूद होने से पहले इसे बंद कर देता है, लेकिन इससे कोई फर्क नहीं पड़ता)। इस फ़ाइल की मूल प्रति, जो कि खोल का फ़ाइल वर्णनकर्ता 3 है, बनी हुई है। यद्यपि वास्तविक फ़ाइल ईओएफ तक पहुंच गई है और इससे आगे कुछ भी नहीं पढ़ा जाएगा।

नामित पाइप से fd3 अलग कैसे है?(मैं कुछ पहले से ही पर ध्यान दिया है)

खोल के <(some command) वाक्य रचना (जो मानक बॉर्न शैल वाक्य रचना नहीं है और मेरा मानना ​​है कि जिस तरह से, zsh और bash में ही उपलब्ध है) वास्तव में नामित पाइप का उपयोग कर लागू किया जा सकता है। यह शायद लिनक्स के तहत नहीं है क्योंकि एक बेहतर तरीका है (/dev/fd का उपयोग करके), लेकिन यह शायद अन्य ऑपरेटिंग सिस्टम पर है।

तो इस अर्थ में, यह वाक्यविन्यास नामित पाइप स्थापित करने के लिए एक सहायक हो सकता है या नहीं भी हो सकता है।

जब आदेश हाँ ठीक से निष्पादित करता है? एफडी घोषणा पर? बाद में?

जैसे ही <(yes violet) निर्माण मूल्यांकन किया जाता है (जो तब होता है जब exec 5< <(yes violet) मूल्यांकन किया जाता है)।

हाँ हाँ स्टॉप (CTRL-Z या अन्य) करता है और अधिक बैंगनी की आवश्यकता होने पर पुनरारंभ होता है?

नहीं, यह रुकता नहीं है। हालांकि, यह जल्द ही पर्याप्त होगा जब यह पाइप के दूसरे छोर को पढ़ने वाले किसी भी चीज़ की तुलना में अधिक उत्पादन का उत्पादन शुरू कर देता है। दूसरे शब्दों में, पाइप बफर भरा हो जाएगा।

मैं हाँ की पीआईडी ​​कैसे प्राप्त कर सकता हूं?

अच्छा सवाल! $!yes निष्पादित होने के तुरंत बाद इसे शामिल करता प्रतीत होता है। हालांकि एक मध्यवर्ती सबहेल लगता है और आपको वास्तव में उस सबहेल का ढक्कन मिलता है। इंटरमीडिएट प्रक्रिया से बचने के लिए <(exec yes violet) आज़माएं।

क्या मुझे "सक्रिय" एफडीएस की सूची मिल सकती है?

खोल से नहीं। लेकिन यदि आप लिनक्स जैसे ऑपरेटिंग सिस्टम का उपयोग कर रहे हैं जिसमें /proc है, तो आप केवल /proc/self/fd से परामर्श कर सकते हैं।

fd4 के माध्यम से फ़िल्टर करने पर बहुत रोचक दौड़ की स्थिति, क्या इससे बचा जा सकता है?

इससे बचने के लिए, संभवतः आप स्क्रिप्ट के माध्यम से आगे बढ़ने से पहले grep प्रक्रिया को पूरा करने के लिए प्रतीक्षा करना चाहते हैं। यदि आप उस प्रक्रिया की प्रक्रिया आईडी (ऊपर के रूप में) प्राप्त करते हैं, तो मुझे लगता है कि आप इसके लिए wait पर सक्षम होना चाहिए।

हाँ हाँ केवल तभी रुक जाएगा जब मैं 5> & निष्पादित करता हूं?

हां। तब क्या होगा कि yes हमेशा उत्पादन का उत्पादन करने की कोशिश करेगा, लेकिन फ़ाइल डिस्क्रिप्टर के दूसरे छोर को बंद कर दिया जाएगा, तो उसे या तो एक त्रुटि त्रुटि (EPIPE), या सिग्नल (SIGPIPE) मिलेगा जो डिफ़ॉल्ट रूप से घातक है।

यह फर्क पड़ता है मैं> & साथ बंद है कि क्या - या < & -

नहीं। दोनों वाक्यविन्यास स्थिरता के लिए उपलब्ध हैं।

+0

'1. यह' बिल्ली 'द्वारा _closed_ हो जाता है, आह-ए! '2.' गॉचा '3.' और '4.' यह कभी" ब्लॉक और प्रतीक्षा "नहीं लगता है? 'exec 3 <<(सत्य होने पर; तारीख करें '+% एच-% एम-% एस' | टीई-ए/टीएमपी/लॉग; नींद 1; किया गया); tail -f/tmp/log' '6. शर्म की बात है! :('7. 'आपने मुझे' प्रतीक्षा 'के बारे में सिखाया !!' नींद 5 और पीआईडी ​​= $!; पहले गूंजें; $ pid प्रतीक्षा करें; इसके बाद गूंज करें - इसे प्यार करें! ** प्रभावशाली उत्तर ** !! ** धन्यवाद * * !!!! – Robottinosino

+1

पुन: "यह कभी भी ब्लॉक और प्रतीक्षा नहीं करता है"। यह अंततः अवरुद्ध होगा ... जब कर्नेल निर्णय लेता है कि उसने पाइप में पर्याप्त डेटा को बफर किया है। मैंने आपका उदाहरण बदल दिया ताकि यह आउटपुट हो प्रत्येक बार लूप के माध्यम से जंक टेक्स्ट का एक गुच्छा (बस इसे तेज़ी से जाने के लिए), और मेरे लिए यह अवरुद्ध हो गया जब '/ tmp/log' फ़ाइल लगभग 48 किलोबाइट हो गई। केवल 'दिनांक' +% H-% के साथ एम-% एस 'यह अभी भी होना चाहिए, इसमें अधिक समय लगेगा :-) – Celada

+0

** गोल्डन **। आप ☆ आदमी हैं ☆ – Robottinosino

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