बैश ने मेकफाइल के अंदर ग्लोबिंग को बढ़ाया


15

मैं एक विशेष फ़ोल्डर में सभी फाइलों पर एक ऑपरेशन करना चाहता हूं जो एक विशेष उपसर्ग (कहना exclude_) से शुरू नहीं होता है । मेरे पास एक forविस्तारित ग्लोब के साथ एक बैश लूप है जो इस तरह दिखता है:

for FILE in foo/bar/!(exclude_*) ; do echo $FILE ; done

कमांड लाइन पर, यह ठीक काम करता है:

 $ for FILE in foo/bar/!(exclude_*) ; do echo $FILE ; done
 foo/bar/apple
 foo/bar/pear
 foo/bar/banana

लेकिन, जब मैं इसे मेकफाइल में उपयोग करता हूं:

target:
    for FILE in foo/bar/!(exclude_*) ; do echo $$FILE ; done

मुझे निम्नलिखित त्रुटि मिलती है:

$ make
for FILE in foo/bar/!(exclude_*) ; do echo $FILE ; done
/bin/sh: -c: line 0: syntax error near unexpected token `('
/bin/sh: -c: line 0: `for FILE in foo/bar/!(exclude_*) ; do echo $FILE ; done'

क्या कुछ आवश्यक बचना है जो मैंने याद किया है?

जवाबों:


7
  1. आपको सेट करने की आवश्यकता है extglob
  2. आपको बाश का उपयोग करने के लिए बताने की आवश्यकता है, श नहीं।

makefile:

SHELL=/bin/bash
.SHELLFLAGS="-O extglob -c"
 ...

2
हम्म। किसी कारण से .SHELLFLAGSमेरे लिए काम नहीं किया, लेकिन सीधे झंडे डाल SHELL=/bin/bash -O extglob -cदिया। कोई विचार क्यों?
टिमोथी जोन्स

1
शायद आप GNU मेक यूज़ नहीं कर रहे हैं। या शायद यह उद्धरण की जरूरत नहीं है।
इग्नासियो वाज़क्वेज़-अब्राम्स

GNU मेक 3.81, और GNU बैश, संस्करण 4.1.2। बिना कोटेशन के भी कोशिश की। अजीब।
टिमोथी जोन्स

वैसे भी, आपके जवाब ने मेरे लिए इसे हल कर दिया, जब मैंने उन सभी को एक पंक्ति में रखा। धन्यवाद!
टिमोथी जोन्स

1
.SHELLFLAGSचर जीएनयू मेकअप 3.82 में जोड़ा गया है। आप देख सकते हैं कि कौन सी विशेषताएं समाचार फ़ाइल के माध्यम से जो विज्ञप्ति में किया गया था: git.savannah.gnu.org/cgit/make.git/tree/NEWS
MadScientist

11

यह मेक और बैश हैक्स के साथ इसे हल करने के लिए अधिक मुहावरेदार और अधिक पोर्टेबल होगा। अगर किसी के पास बैश नहीं है तो क्या होगा?

वैसे भी, मेक में यह करने का उचित तरीका है:

FOOFILES = $(filter-out foo/bar/exclude_%,$(wildcard foo/bar/*))

target:
    for FILE in ${FOOFILES}; do echo $$FILE ; done

2

यहाँ एक सरल तरीका है:

SHELL:=/bin/bash -O globstar

जो ग्लोबस्टार शेल विकल्प को सक्षम करेगा (जो बीएसडी / ओएस एक्स पर भी काम करता है)।


0

इसे Makefile के शीर्ष पर जोड़ें:

SHELL := bash -O extglob

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