कोष्ठक बैश शेल में ही काम करता है, लेकिन बैश स्क्रिप्ट में नहीं


11

मैं अपनी कमांड लाइन प्रॉम्प्ट से इस कमांड को चला सकता हूं:

cp -r folder/!(exclude-me) ./

वर्तमान निर्देशिका में नामित उपनिर्देशिका folder को छोड़कर सभी सामग्रियों की पुनरावृत्ति करने के लिए exclude-me। यह बिल्कुल इच्छित के अनुसार काम करता है। हालाँकि, मेरे द्वारा लिखी गई बाश स्क्रिप्ट में काम करने के लिए मुझे इसकी आवश्यकता है, जहाँ मेरे पास यह है:

if [ -d "folder" ]; then
  cp -r folder/!(exclude-me) ./
  rm -rf folder
fi

लेकिन जब मैं स्क्रिप्ट चलाता हूं:

bash my-script.sh

मैंने इसे प्राप्त किया:

my-script.sh: line 30: syntax error near unexpected token `('
my-script.sh: line 30: `  cp -r folder/!(exclude-me) ./'

और मैं कमांड प्रॉम्प्ट से क्यों काम करता हूं के रूप में नुकसान में हूं, लेकिन एक ही लाइन बैश स्क्रिप्ट में काम नहीं करता है।

जवाबों:


11

ऐसा इसलिए है क्योंकि आप जो वाक्यविन्यास का उपयोग कर रहे हैं वह एक विशेष बैश फीचर पर निर्भर करता है जो कि गैर-संवादात्मक गोले (स्क्रिप्ट) के लिए डिफ़ॉल्ट रूप से सक्रिय नहीं है। आप अपनी स्क्रिप्ट में संबंधित कमांड जोड़कर इसे सक्रिय कर सकते हैं:

## Enable extended globbing features
shopt -s extglob

if [ -d "folder" ]; then
  cp -r folder/!(exclude-me) ./
  rm -rf folder
fi

यह संबंधित अनुभाग है man bash:

   If the extglob shell option is enabled using the shopt builtin, several
   extended  pattern  matching operators are recognized.  In the following
   description, a pattern-list is a list of one or more patterns separated
   by a |.  Composite patterns may be formed using one or more of the fol
   lowing sub-patterns:

          ?(pattern-list)
                 Matches zero or one occurrence of the given patterns
          *(pattern-list)
                 Matches zero or more occurrences of the given patterns
          +(pattern-list)
                 Matches one or more occurrences of the given patterns
          @(pattern-list)
                 Matches one of the given patterns
          !(pattern-list)
                 Matches anything except one of the given patterns

यह दूसरी बार है जब मुझे यह उत्तर मिला (हां, बुरी याददाश्त)। इस बार env > file1स्क्रिप्ट में चलाने और निष्पादित करने की कोशिश की ./it, और फिर env > file2और source it, इस उम्मीद में कि मुझे envएस में अंतर मिला होगा , जो कि मामला नहीं है। मैं प्रोग्रामेटिक रूप से दो शेल के बीच के सभी अंतर को कैसे सूचीबद्ध कर सकता हूं (इस मामले में इंटरएक्टिव बनाम गैर-इंटरएक्टिव)?
एनरिको मारिया डे एंजेलिस


2

इस लाइन को अपनी स्क्रिप्ट के ऊपर जोड़ें:

shopt -s extglob

!(...)एक विस्तारित पैटर्न मिलान सुविधा है, आपको extglobइसका उपयोग करने के लिए विकल्प सक्षम करने की आवश्यकता है। देखें shopt builtin अधिक जानकारी के लिए।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.