2013-09-05 7 views
5

एक Centos 6 मशीन पर, यह काम करता है:sh प्रति प्रक्रिया प्रतिस्थापन का समर्थन नहीं करता <(...)?

bash -c 'if grep -qP --line-buffered ".+" <(tail -n 1000 -F catalina.out) ; then echo "yes"; fi' 

और इस कार्य नहीं करता:

sh -c 'if grep -qP --line-buffered ".+" <(tail -n 1000 -F catalina.out) ; then echo "yes"; fi' 

मैं:

sh: -c: line 0: syntax error near unexpected token `(' 
sh: -c: line 0: `if grep -qP --line-buffered ".+" <(tail -n 1000 -F catalina.out) ; then echo "yes"; fi' 

कोई बात नहीं ग्रेप और पूंछ। समस्या प्रक्रिया प्रतिस्थापन चीज़ के साथ है: <(...)

क्या कोई मुझे बता सकता है कि कौन सा sh अलग-अलग करता है?

[संपादित करें]

उत्तर के लिए धन्यवाद!

तैनाती के लिए capistrano का उपयोग करते समय समस्या उत्पन्न हुई। यह sh का उपयोग करने के लिए डिफ़ॉल्ट है, लेकिन मैंने इसे bash में बदल दिया है। कारण मैं सामान्य पाइपिंग नहीं कर सकता था कि tail -F | grep -q --line-buffered का उपयोग करते समय, grep एक मैच के तुरंत बाद बाहर नहीं निकल जाएगा। echo "" >> catalina.out जैसी फ़ाइल में एक और संपादन होना चाहिए और यह मेरी स्थिति में स्वीकार्य नहीं था।

उत्तर

5

वाक्यविन्यास <(...) केवल बाश द्वारा समर्थित है।

किसी भी POSIX खोल के लिए, इस दृष्टिकोण का उपयोग:

sh -c 'tail -n 1000 -F catalina.out | if grep -qP --line-buffered ".+" ; then ...' 

अर्थात एक पाइप के साथ if के सामने stdin पुनर्निर्देशन चलते हैं। ifgrep पर stdin पास करेगा।

if tail ...| grep काम नहीं करेगा क्योंकि if क्योंकि पाइप प्रक्रियाओं को अलग करती है यह then/fi है देखने के लिए सक्षम नहीं होगा।

+0

'पूंछ ... | grep ...; तो ... फाई 'पॉज़िक्स मोड में डैश और बैश में मेरे लिए काम करता है। – choroba

+0

@choroba: हाँ। लेकिन क्या यह 'sh' या' ksh' में काम करता है? –

+0

यह ksh में काम करता है। मेरे सिस्टम पर 'sh' पॉज़िक्स मोड में डैश या बैश है। – choroba

3

यह भी ध्यान दें कि यदि Bash is invoked with the name sh है, तो यह संभवतः जितना संभव हो सके ऐतिहासिक संस्करणों के स्टार्टअप व्यवहार की नकल करने की कोशिश करता है, जबकि POSIX मानक के अनुरूप भी।

यदि आपका शा वास्तव में बाश का एक लिंक है, तो यही कारण है कि इसका कारण बन रहा है।

sh --version; sh -c ': <(echo a)' चलाना आपको पर्याप्त जानकारी देनी चाहिए।

5

आपको ध्यान रखना चाहिए कि प्रक्रिया प्रतिस्थापन (<(...)) POSIX द्वारा निर्दिष्ट नहीं है। तो अगर आप sh के साथ लागू या कह कर POSIX मोड में bash चल रहे थे:

set -o posix 

तो आप त्रुटियों का निरीक्षण चाहते हैं!

bash manual से

: --posix कमांड लाइन विकल्प के साथ

शुरू बैश या क्रियान्वित 'set -o posix' बैश के व्यवहार को बदलने के द्वारा बैश POSIX मानक के लिए और अधिक बारीकी से पालन करने का कारण होगा चल रहा है, जबकि मिलान करें कि उन क्षेत्रों में POSIX द्वारा निर्दिष्ट जहां बैश डिफ़ॉल्ट भिन्न है।

...

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

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