2013-09-24 7 views
5

एक फ़ाइल "foo.txt" को देखते हुए, से बनाए गए:subshell आईओ पुनर्निर्देशन

$ seq 1 10 > "foo.txt" 

मैं फ़ाइल के दोनों पहली और आखिरी पंक्ति को पढ़ने के लिए कोशिश कर रहा हूँ, और मैं एक subshell करने के लिए फ़ाइल पुनः निर्देशित द्वारा शुरू किया, ताकि कमांड की सूची क्रम में फ़ाइल की खपत होगी - हर कमांड बिंदु पिछले आदेश में यह छोड़ दिया है से इनपुट की खपत, मैं लगता है:

$ (head -1; tail -1) < "foo.txt" 
1 
10 

हालांकि, अगर मैं एक अस्थायी के साथ एक ही कोशिश फ़ाइल वर्णनकर्ता, उत्पादन ही नहीं है:

$ (head -1; tail -1) < <(seq 1 10) 
1 

प्रश्न:

  1. मैं क्या <(seq 1 10) नाम के बारे में सुनिश्चित नहीं हूँ, लेकिन इस अस्थायी के बीच अंतर क्या है फाइल डिस्क्रिप्टर और नियमित एक ("foo.txt"), जिससे सबहेल निष्पादन अलग-अलग व्यवहार कर सकता है?

  2. मैं subshell करने के लिए एक "foo.txt" पुनः निर्देशित की समान व्यवहार कैसे प्राप्त कर सकते हैं, लेकिन एक अस्थायी फ़ाइल के बिना - वास्तव में एक फ़ाइल बनाने के बिना।

उत्तर

5

यह सिर्फ एक बफरिंग मुद्दा है। आज़माएं:

cat foo.txt | (head -1; tail -1) 

और आप (शायद) एक ही चीज़ देखेंगे (सिर पूरे इनपुट का उपभोग करता है)। शायद यह हो रहा है कि सिर एक पाइप की तुलना में एक नियमित फ़ाइल के साथ अलग-अलग व्यवहार कर रहा है, और प्रक्रिया प्रतिस्थापन (जो <(cmd) वाक्यविन्यास का नाम है) एक पाइप बना रहा है। (लिनक्स में, head GNU coreutils से अंतिम न्यू लाइन है कि यह आउटपुट पर स्थिति बदलने के लिए प्रयास करने के लिए एक lseek करता है, लेकिन lseek एक पाइप पर विफल रहता है।)

भी आज़माएं:

(head -1; tail -1) < <(cat /usr/share/dict/words) 

यहाँ, head केवल इनपुट के पहले पृष्ठ का उपभोग करता है, और पूंछ डेटा की अंतिम पंक्ति को देखता है।

जो व्यवहार आप देख रहे हैं वह अच्छी तरह से परिभाषित नहीं है, क्योंकि कोई मानक नहीं है जो यह निर्धारित करता है कि कितने डेटा हेड का उपभोग करने की अनुमति है। यदि आप head को sh -c 'read line; echo "$line"' के साथ प्रतिस्थापित करते हैं, तो आपको सभी मामलों में वांछित व्यवहार प्राप्त होगा। (या head का व्यवहार प्रदान करने के लिए अपना स्वयं का टूल लिखें, जो आप चाहते हैं - उस से अधिक उपभोग नहीं करते समय लाइनों की एक निश्चित संख्या मुद्रित करें।)

+1

+1 बहुत अच्छी व्याख्या के लिए +1। हालांकि, ओपी पूछ रहा है कि क्या इस तरह के व्यवहार को बिना किसी अस्थायी फ़ाइल के प्राप्त करना संभव है। क्या यह? मेरे परीक्षण असफल रहे। – fedorqui

+0

'sh -c" पढ़ने वाली रेखा के साथ 'head' को प्रतिस्थापित करके; "$ line" echo echo, वांछित व्यवहार अस्थायी फ़ाइल के बिना पूरा किया जा सकता है। –

+0

+1 यह सटीक स्पष्टीकरण है जिसे मैं ढूंढ रहा था!चूंकि आपने अपनी चीजों को बनाने के बारे में बात की है, इसलिए मैं अपने दोस्तों की एक शेल लिपि लिखने के बारे में सोच रहा हूं; हम किसी भी तरह के कार्यात्मक खोल के बारे में सोच रहे हैं, पैटर्न मिलान और सभी बेहतरीन चाल के साथ (: – Rubens