2009-02-26 11 views
143

मुझे अक्सर Bash वाक्यविन्यास बहुत उपयोगी लगता है, उदा। प्रक्रिया प्रतिस्थापन diff <(sort file1) <(sort file2) में।मेकफ़ाइल लक्ष्यों में मैं बैश वाक्यविन्यास का उपयोग कैसे कर सकता हूं?

क्या मेकफ़ाइल में ऐसे बैश कमांड का उपयोग करना संभव है? मैं कुछ इस तरह की सोच रहा हूँ:

file-differences: 
    diff <(sort file1) <(sort file2) > [email protected] 

मेरी जीएनयू में बनाओ 3.80 यह एक त्रुटि दे देंगे क्योंकि यह shellbash के बजाय का उपयोग करता है आदेश पर अमल करने के लिए।

उत्तर

258

प्रलेखन जीएनयू बनाने से,

5.3.1 Choosing the Shell 
------------------------ 

The program used as the shell is taken from the variable `SHELL'. If 
this variable is not set in your makefile, the program `/bin/sh' is 
used as the shell. 

तो अपने makefile के शीर्ष पर SHELL := /bin/bash रखा, और तुम जाना अच्छा होना चाहिए।

बीटीडब्लू: आप कम से कम जीएनयू मेक के लिए इसे एक लक्ष्य के लिए भी कर सकते हैं। प्रत्येक लक्ष्य इस तरह अपनी ही चर कार्य हो सकता है,:

all: a b 

a: 
    @echo "a is $$0" 

b: SHELL:=/bin/bash # HERE: this is setting the shell for b only 
b: 
    @echo "b is $$0" 

कि प्रिंट होगा:

a is /bin/sh 
b is /bin/bash 

देखें "लक्ष्य-विशिष्ट चर मान" दस्तावेज में अधिक जानकारी के लिए। यह लाइन मेकफ़ाइल में कहीं भी जा सकती है, इसे लक्ष्य से तुरंत पहले नहीं होना चाहिए।

bash -c "ls -al" 

के बजाय:

+21

500 बाउंटी 'मैन' से उद्धरण के लिए प्रतीक्षा कर रहा है। समय के बारे में बात करो। : पी – SiddharthaRT

+3

@inLoveWithPython खैर, वास्तव में, 'जानकारी', लेकिन, मुझे लगता है कि यह वास्तव में एंडी की मदद की। मुझे पता है कि मेरे पास ऐसे दिन हैं ... – derobert

+2

यदि संदेह में, @derobert का शाब्दिक अर्थ है: 'SHELL =/bin/bash' मेकफ़ाइल की पहली पंक्ति के रूप में (या टिप्पणी के ठीक बाद)। –

10

आप bash सीधे कॉल कर सकते हैं, -c ध्वज का उपयोग करें:

bash -c "diff <(sort file1) <(sort file2) > [email protected]" 
बेशक

, आप चर $ @ पर रीडायरेक्ट करने में सक्षम नहीं हो सकता है, लेकिन जब मैं यह करने के लिए करने की कोशिश की, मैं के रूप में -bash: [email protected]: ambiguous redirect मिला एक त्रुटि संदेश, ताकि आप इसमें शामिल होने से पहले इसे देखना चाहें (हालांकि मैं बैश 3.2.something का उपयोग कर रहा हूं, इसलिए शायद आपका अलग-अलग काम करता है)।

2

आप बैश सीधे अपने Makefile भीतर बजाय डिफ़ॉल्ट खोल का उपयोग करने का कॉल कर सकते हैं

ls -al 
+0

ध्यान दें कि 'make' पर्यावरण परिवर्तनीय SHELL के मान को अनदेखा करता है। – choroba

4

तो पोर्टेबिलिटी महत्वपूर्ण है कि आप एक विशिष्ट खोल पर निर्भर न करना चाहें अपने मेकफ़ाइल में सभी वातावरण में उपलब्ध नहीं है।

1

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

यदि आप sudo dpkg-reconfigure dash चलाते हैं और प्रॉम्प्ट पर 'नहीं' का उत्तर देते हैं, तो आपका सिस्टम डैश को डिफ़ॉल्ट खोल के रूप में उपयोग नहीं करेगा। इसके बाद यह बाश (कम से कम उबंटू में) इंगित करेगा। ध्यान दें कि आपके सिस्टम खोल के रूप में डैश का उपयोग करना थोड़ा और अधिक कुशल है।

+1

नाम 'sh' के नाम से बोले जाने पर, बैश संगतता मोड (' set -o posix') में चलता है। ओपी कार्यक्षमता का उपयोग करने की कोशिश कर रहा है, प्रतिस्थापन प्रक्रिया, इस मोड में उपलब्ध नहीं है। –

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

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