2012-08-25 12 views
7

के साथ खोल स्क्रिप्ट में सिंटेक्स त्रुटि मेरे पास यह शेल स्क्रिप्ट है जिसका उपयोग मैं अपने सिस्टम का बैक अप लेने के लिए करता हूं।प्रक्रिया प्रतिस्थापन

tar -Pzcpf /backups/backup.tar.gz --directory=/ --exclude=proc --exclude=sys --exclude=dev/pts --exclude=backups --exclude=var/log/2> >(grep -v 'socket ignored' >&2) 

आप देख सकते हैं, मैं बाहर फिल्टर करने के लिए कष्टप्रद, बेकार "सॉकेट पर ध्यान नहीं दिया" टार द्वारा त्रुटि, this blog post का उपयोग कर प्रयास कर रहे हैं: वहाँ एक पंक्ति है।

क्या मैं निष्पादन पर खोल से मिलता है:

/bin/sysback: लाइन 45: अप्रत्याशित टोकन >' /bin/sysback: line 45: टार -Pzcpf/बैकअप/बैकअप --directory =/ --exclude = पास सिंटैक्स त्रुटि proc --exclude = sys --exclude = देव/--exclude अंक = बैकअप --exclude = var/log/2>> (ग्रेप -v 'सॉकेट पर ध्यान नहीं दिया'> & 2) '

+0

मुझे लगता है कि '2>> (' होना चाहिए '2> ('। –

+0

इस परिवर्तन के बाद एक सिंटैक्स त्रुटि देना नहीं था, लेकिन या तो उत्पादन को फ़िल्टर नहीं किया। –

+2

> (...) प्रक्रिया प्रतिस्थापन वाक्यविन्यास एक गैर-मानक सुविधा है, और आपका खोल स्पष्ट रूप से इसका समर्थन नहीं करता है। एक अलग खोल का उपयोग करें, या शायद बैश का एक नया संस्करण। –

उत्तर

17

आपके द्वारा उपयोग किया गया वाक्यविन्यास मूल खोल वाक्यविन्यास के लिए एक बैश एक्सटेंशन है, इसलिए आपको अपनी स्क्रिप्ट को बैश के साथ चलाने के लिए सावधानी बरतनी चाहिए। (Ksh भी >(…) प्रक्रिया प्रतिस्थापन है लेकिन पुनर्निर्देशन के बाद इसका समर्थन नहीं करता है। Zsh ठीक होगा।)

आपको जो त्रुटि संदेश मिल रहा है, उसे देखते हुए, आप इस स्क्रिप्ट को बैश में चला रहे हैं, लेकिन इसके POSIX संगतता मोड में , पूर्ण बैश मोड में नहीं। एक स्पष्ट #!/bin/bash लाइन के साथ अपनी स्क्रिप्ट का आह्वान करने के लिए सावधानी बरतें। #!/bin/sh नहीं करेगा, भले ही /bin/sh बैश के लिए एक प्रतीकात्मक लिंक है, क्योंकि sh नाम के तहत बोस को पॉज़िक्स मोड में चलाया जाता है। यदि आप बैश सुविधाओं का उपयोग करते हैं तो हमेशा नाम से बैश का आह्वान करें।

यह भी ध्यान रखें कि पर्यावरण परिवर्तनीय POSIXLY_CORRECT सेट न करें या कमांड लाइन पर --posix विकल्प को पास करने के लिए यदि आप बैश सुविधाओं का उपयोग करना चाहते हैं।

वैकल्पिक रूप से, इस बैश-विशिष्ट वाक्यविन्यास का उपयोग न करें; पोर्टेबल निर्माण का उपयोग करें जैसे कि Stephane Rouberol द्वारा प्रस्तावित एक।

7

कैसे के बारे में :

tar -Pzcpf /backups/backup.tar.gz --directory=/ \ 
    --exclude=proc --exclude=sys --exclude=dev/pts \ 
    --exclude=backups --exclude=var/log 2>&1 | grep -v 'socket ignored' 
+1

भले ही आप यहां क्या पेशकश कर रहे हैं, समाधान के लिए एक वैध विकल्प है, मैं सही जवाब के रूप में @Gilles समाधान का चयन करूँगा, क्योंकि यह सवाल के जवाब में जवाब देता है। हालांकि बहुत अच्छे जवाब के लिए धन्यवाद। –

0

मैं ने पाया है कि Gentoo पर भी अगर श को/bin/bash एक कड़ी है अगर आप 'श "SCRIPTNAME स्क्रिप्ट"' के साथ स्क्रिप्ट कॉल यह एक bash स्क्रिप्ट के रूप में यह नहीं चलता है और साथ विफल:

matchmorethan.sh: line 34: syntax error near unexpected token `<' 
matchmorethan.sh: line 34: `done < <(cat $matchfile)' 

तो यदि आपको प्रक्रिया प्रतिस्थापन सुविधा का उपयोग करने की आवश्यकता है तो आपको इसे विशेष रूप से बैश के साथ चलाने की आवश्यकता है। लेकिन मुझे इसका कोई संदर्भ नहीं मिला।

1

असल में आपको एसडीडी त्रुटि में ऐसे पुनर्निर्देशन के लिए जाना नहीं है जब जीएनयू टैर "सॉकेट अनदेखा" चेतावनी को अनदेखा करने के विकल्प प्रदान करता है।

tar --warning='no-file-ignored' -Pzcpf /backups/backup.tar.gz --directory=/ --exclude=proc --exclude=sys --exclude=dev/pts --exclude=backups --exclude=var/log/2> new.err 

You could find the original link with more ignore options here

+0

टिप्पणी के लिए धन्यवाद, लेकिन विशेष रूप से लिंक के लिए धन्यवाद :) –

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