2011-08-12 7 views
90

मैं इस वाक्य रचना से परिचित हूँ:एक हेड्रोक पाइपिंग के लिए मल्टीलाइन सिंटैक्स; क्या यह पोर्टेबल है?

cmd1 << EOF | cmd2 
text 
EOF 

लेकिन सिर्फ इतना है कि पार्टी की खोज की अनुमति देता है मुझे लिखने के लिए:

cmd1 << EOF | 
text 
EOF 
cmd2 

(हियरडॉक CMD2 को इनपुट के रूप में प्रयोग किया जाता है)। यह एक बहुत ही विचित्र वाक्यविन्यास की तरह लगता है। क्या यह पोर्टेबल है?

+0

मैं इस एकाधिक पंक्तियों में विभाजित की एक अच्छा तरीका खोजने के लिए यहां आया था: आर्ग के बहुत सारे << EOF के साथ 'बड़े लंबे समय से है command1 | बहुत सारे तर्कों के साथ बड़े-लंबे कमांड 2। "विषम वाक्यविन्यास" सबसे अच्छा तरीका लगता है। – PaulC

+0

इसके लिए एक सुविधाजनक उपयोग केस तब होता है जब आप किसी तालिका को कनवर्ट करने का प्रयास कर रहे हैं, जो कि टैब-डिलीमिट किए गए स्थान में सीमित है ताकि आप इसे Google स्प्रेडशीट में पेस्ट कर सकें। आपको एक अस्थायी फ़ाइल नहीं बनाना पड़ेगा। –

+0

पहला व्यक्ति जेड-शैल में मेरे लिए काम नहीं करता था। मुझे दूसरा पसंद नहीं है क्योंकि यह | कमांड से, खोल पाइपलाइनों की मूर्खता (?) खोना। –

उत्तर

72

हाँ, POSIX मानक इस अनुमति देता है। According to the 2008 version:

यहाँ-दस्तावेज़ एक शब्द है कि अगले <newline> के बाद शुरू होती है और जब तक वहाँ केवल सीमांकक और एक <newline> रखने वाली पंक्ति के बीच में कोई <blank> पात्रों के साथ है जारी है के रूप में माना जाएगा। फिर अगला यहां-दस्तावेज़ शुरू होता है, यदि कोई है।

और कई की "यहाँ-दस्तावेजों" एक ही पंक्ति में इस उदाहरण में शामिल हैं:

cat <<eof1; cat <<eof2 
Hi, 
eof1 
Helene. 
eof2 

तो वहाँ पुनर्निर्देशन या पाइप कर कोई समस्या नहीं है। आपका उदाहरण कुछ इस तरह के समान है:

cat file | 
cmd 

और खोल व्याकरण (आगे लिंक किए गए पृष्ठ पर नीचे) इन परिभाषाओं में शामिल हैं:

pipe_sequence :        command 
       | pipe_sequence '|' linebreak command 

newline_list  :    NEWLINE 
       | newline_list NEWLINE 
       ; 
linebreak  : newline_list 
       | /* empty */ 

तो एक पाइप प्रतीक एक अंत के बाद किया जा सकता है ऑफलाइन और अभी भी एक पाइपलाइन का हिस्सा माना जाता है।

9

हम्म, मैं हाँ POSIX मोड में बैश में परीक्षण के अनुसार लगता है,:

$ bash --posix 
$ cat <<EOF | 
> ahoj 
> nazdar 
> EOF 
> sed 's/a/b/' 
bhoj 
nbzdar 
+1

'डैश' में भी काम करता है –

+0

बस एक और छोटा नोट: समापन 'EOF' के बाद कोई भी स्थान न रखें। प्रॉम्प्ट अजीब तरीके से व्यवहार करेगा और आपको आश्चर्य होगा कि क्या गलत है –

+0

पॉज़िक्स-मोड में चल रहे बैश * कुछ * एक्सटेंशन बंद हो जाता है, लेकिन किसी भी माध्यम से लगभग सभी को नहीं। इस प्रकार, जबकि यह जवाब POSIX की अनुमति के संदर्भ में सही है, इसकी तर्क उस प्रभावी ढंग से समर्थन नहीं करती है। –

15

हां यह पॉज़िक्स शैल व्याकरण में है। तुम भी यहां-डॉक समान आदेश के लिए की तुलना में अधिक हो सकता है (कुछ अन्य उदाहरण दो cat आमंत्रण उपयोग करें, लेकिन यह रूप में अच्छी तरह से काम करता है):

cat <<EOF1 <<EOF2 
first here-doc 
EOF1 
second here-doc 
EOF2 

यह काल्पनिक है (stdin के लिए 2 यहाँ-डॉक्स का उपयोग करते हुए), लेकिन यदि आप विभिन्न फ़ाइल वर्णनकर्ताओं के लिए इनपुट प्रदान करने के बारे में सोचते हैं तो यह तुरंत समझ में आता है।

cat पूरी तरह से को छोड़ने की संभावना भी है। क्यों cmd करने के लिए यहाँ-दस्तावेज़ सीधे उपलब्ध नहीं बनाना:

cmd << EOF 
input 
here 
EOF 
+0

'' ' बिल्ली << EOF1 << EOF2 पहले यहाँ-डॉक EOF1 दूसरा यहां-डॉक EOF2 ' '' से काम नहीं होता। – user1424739

+0

@ user1424739 यह वर्तमान zsh और bash में काम करता है। राख और ksh93 केवल दूसरे यहां दस्तावेज़ आउटपुट प्रतीत होता है। – Jens

+0

डाउनवोट क्यों? अगर कुछ गलत है, तो कृपया मुझे उपाय करने का मौका दें। – Jens

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