मुझे अपने मेकफ़ाइल में कोड की एक पंक्ति चलाने में समस्या है जो अच्छी तरह से चलता है /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)
व्यक्तिगत रूप से, मैं आपकी फ़ाइल नामकरण योजना बदल दूंगा या फ़ाइल नामों को बनाऊंगा जिन्हें आप मेक वैरिएबल में हटाना चाहते हैं।