/ / समर्थन क्यों नहीं होगा! (...) पैटर्न बनाते समय निष्पादित (w / SHELL: = / bin / bash)? - लिनक्स, बैश, खोल, मेकफ़ाइल

समर्थन क्यों नहीं होगा! (...) पैटर्न बनाते समय निष्पादित (w / SHELL: = / bin / bash)? - लिनक्स, बैश, खोल, मेकफ़ाइल

मुझे अपने मेकफ़ाइल में कोड की एक पंक्ति चलाने में समस्या है जो अच्छी तरह से चलता है /bin/bash। मुझे पता है कि रन बनाओ /bin/sh तो मेरे पास है इस गाइड के साथ उस समस्या को हल किया यह घोषणा करके कि मैं इसे बैश में चलाने के लिए चाहता हूं। हालांकि, भले ही मैं मेक इन बैश चलाता हूं, फिर भी मैं इस लाइन को काम करने के लिए नहीं मिल सकता, यहां तक ​​कि यह बाश में भी कड़ी मेहनत करता है।

चलते समय बैश एक त्रुटि क्यों फेंक देता है rm -f !(2).txt मेकफ़ाइल में लेकिन जब उसके खोल में निष्पादित नहीं किया गया था?

संपादित करें: मैं उन फ़ाइलों में से एक को छोड़कर एक निश्चित फ़ाइल एक्सटेंशन के साथ सभी फाइलों को हटाना चाहता हूं। आदेश rm -f !(2).txt बस यही करता है मेरे बैश टर्मिनल में लेकिन मेक में नहीं।

संपादित करें: चलते समय rm -f !(2).txt टर्मिनल में "सामान्य रूप से" बैश के साथ (टर्मिनल लौटा bash आदेश जारी करते समय echo "$0") यह ठीक काम करता है लेकिन मैं दौड़ता हूं /bin/bash -c "rm -f !(2).txt" मुझे मेकफ़ाइल में एक ही त्रुटि मिलती है।

all: clean

clean: SHELL:=/bin/bash
clean:
rm -f !(2).txt

बैश में रनिंग कमांड

 $ ls
1.txt  2.txt  3.txt  4.txt  Makefile    # Directory has all text files
$ rm -f !(2).txt                       # Remove all text files but 2.txt
$ ls
2.txt  Makefile                         # Only 2.txt is not removed

मेकफ़ाइल के माध्यम से बैश में चल रहा आदेश

 $ ls                                   # Directory has all text files
1.txt  2.txt  3.txt  4.txt  Makefile
$ make clean                           # Running make
rm -f !(2).txt
/bin/bash: -c: line 0: syntax error near unexpected token `("
/bin/bash: -c: line 0: `rm -f !(2).txt"
make: *** [clean] Error 1

उत्तर:

जवाब के लिए 2 № 1

आपको सक्षम करने की आवश्यकता है extglob इसे काम करने के लिए खोल विकल्प। जीएनयू में, इसे हासिल किया जा सकता है

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

प्रश्न लेखक द्वारा संपादित करें

उपरोक्त कोड की दो पंक्तियों के साथ उदाहरण मेरे लिए काम नहीं करता था, लेकिन जैसा कि इस साथी को पता चला, संस्करणों के आधार पर एक अलग समाधान प्रतीत होता है।

हम्म। किसी कारण से .SHELLFLAGS मेरे लिए काम नहीं किया, लेकिन झंडे सीधे अंदर डाल दिया SHELL=/bin/bash -O extglob -c किया था। [...] - तीमुथियुस जोन्स

उदाहरण @choroba मेक 4.0 में काम करता है लेकिन मेरे पास काम नहीं करता है क्योंकि मैंने 3.81 बना दिया है। हालांकि, मेरा समाधान यहां है:

all: clean

clean: SHELL=/bin/bash -O extglob -c
clean:
rm -f !(2).txt

जवाब के लिए 0 № 2

मुझे पता नहीं है कि "! (2) .txt" का अर्थ है, यदि आपको वास्तव में इस निर्माण का उपयोग करना चाहिए, तो $ (खोल) फ़ंक्शन का उपयोग करें:

%(shell rm -f !(2).txt)

व्यक्तिगत रूप से, मैं आपकी फ़ाइल नामकरण योजना बदल दूंगा या फ़ाइल नामों को बनाऊंगा जिन्हें आप मेक वैरिएबल में हटाना चाहते हैं।