कमांड जो शून्य स्थिति (नहीं / बिन / सच) के साथ बाहर निकलती है?


11

मुझे एक मेकफाइल मिला है जो एक उपकरण चलाता है जो थोड़ी देर लेता है; यह मुझे प्रयुक्त कमांड को बदलने की अनुमति देता है:

make TOOL=alternative-tool

मैं उस कदम को मेकफिल में छोड़ना चाहूंगा, इसलिए मैं एक कमांड की तलाश कर रहा हूं जो कि स्थिति 0 से बाहर निकलता है, और जिसमें नगण्य दुष्प्रभाव होते हैं।

जाहिर है, मैं बस का उपयोग कर सकता है true, लेकिन यह थोड़े भ्रामक है:

make TOOL=true

ऐसा लगता है जैसे मैं उपकरण चलाना चाहता हूं , लेकिन मैं नहीं।

क्या कोई डिफ़ॉल्ट-स्थापित निष्पादन योग्य है जो /bin/trueकि स्थिति 0 से बाहर नहीं निकलता है, और जो एक आकर्षक और टाइप नाम के लिए आसान है?


Makefiles टिप्पणियों का समर्थन करते हैं, gnu.org/software/make/manual/html_node/Makefile-Content.html । लाइन से पहले एक टिप्पणी डालें और अपने कोड को दस्तावेज़ित करें। यह भ्रम को कम करता है और बताता है कि आपने एक निश्चित दृष्टिकोण का उपयोग क्यों किया।
फ्रीहिट

1
क्या लाइन है? TOOL=trueजब मेकअप, संभवत: निकटवर्ती एक README में दस्तावेज लागू कमांड लाइन पर किया जाएगा। उपकरण को लागू करने वाली वास्तविक रेखा कहीं-कहीं 7000-लाइन (थर्ड पार्टी) मेकफाइल है।
रोजर लिप्सकॉम्ब

जवाबों:


42

भले ही आपने कुछ ऐसा पूछा है जो "नहीं /bin/true" है, trueपूरे नाम के साथ /bin/trueयह दर्शाने के लिए कि यह true"सत्य" के कुछ अन्य अर्थ के बजाय कार्यक्रम है, शायद सबसे अच्छा समाधान है।

आपकी चिंता यह है कि trueमें

make TOOL=true

एक कमांड नाम के अलावा कुछ और प्रतीत होता है। लेकिन अगर आप लिखेंगे

make TOOL=/bin/true

तब वह स्पष्ट रूप से एक आज्ञा है। किसी को यह बताने के TOOL=trueलिए गलत हो सकता है कि कुछ अन्य उपकरण का इरादा है, लेकिन इस तरह के किसी भी गलत तरीके की TOOL=/bin/trueसंभावना नहीं है।


मैं इस बात के लिए अनिश्चित हूं कि कब :, कौन सी शेल निर्मित है लेकिन बाहरी कमांड नहीं है, काम करेगा। हेनिंग मैखोलम ने बताया है कि यह काम करता प्रतीत होता है । लेकिन मुझे लगता है कि यह सभी स्थितियों में काम नहीं करता है, और आपने पाया कि यह आपके लिए काम नहीं करता

शेल उपनाम के रूप में, आप इसका उपयोग नहीं कर सकते क्योंकि उपनाम आपके द्वारा पास किए गए तर्कों में नहीं किया जाता है, और न ही मेकफाइल्स पहले से परिभाषित शेल उपनामों का कोई उपयोग करते हैं। यहां तक ​​कि अगर makeआपके आदेश एक नए शेल में चलते हैं, तो उस शेल में उपनाम नहीं होगा (और इसका उपयोग नहीं करेगा, भले ही उसने ऐसा किया हो, क्योंकि यह एक गैर-निष्क्रिय शेल होगा, जहां उपनाम का विस्तार स्वचालित रूप से सक्षम नहीं है)।


1
उपयोग करना :मेरे लिए ठीक काम करता है। makeहमेशा प्रत्येक कमांड को चलाने के लिए एक शेल को खोल दिया जाता है, क्योंकि यह अपने स्वयं के प्रतिस्थापन के बाद होता है।
हमखोलम ने मोनिका

@ हेनिंगमखोलम धन्यवाद, मैंने संपादित किया है। आप एक उत्तर पोस्ट करना चाह सकते हैं। लोक लाम चेंग ने सुझाव देने के लिए सवाल पर टिप्पणी की थी :, लेकिन यह एक उत्तर होना चाहिए (विशेषकर यदि सही है) और यह टिप्पणी यह ​​नहीं समझाती है कि किसी को यह काम करने की उम्मीद क्यों करनी चाहिए। एक निर्देशिका में hello.cऔर कोई मेकफाइल के साथ, जहां make helloसंकलन करता hello.cहै hello, मैंने पाया make CC=: helloकि आप जो कह रहे हैं, उसके अनुसार व्यवहार किया गया है।
एलियाह कगन

2
दुर्भाग्य से, इस विशेष Makefile के लिए (यह erlang.mk का उपयोग :करता है ), काम नहीं करता है। इसके बारे /bin/trueमें स्पष्ट होना शायद सबसे अच्छा तरीका है।
रोजर लिप्सकॉम्ब

7

हालांकि मैं मानता हूं कि पूर्ण पथ का उपयोग trueकरना सबसे अच्छा समाधान होगा, मैं यह नोट करना चाहूंगा कि वास्तविक कमांड निष्पादन से बचने के लिए अब तक का सबसे आम तरीका क्या है: echoइसके सामने एक चिपका । इसलिए:

make TOOL=echo

मुझे लगता है कि यह कभी-कभी उपयोगी होता है जब यह महत्वपूर्ण होता है कि यह याद दिलाया जाए कि कोई भी TOOLअन्यथा कार्रवाई को दबा देगा। बिना -sया समकक्ष, makeनिरर्थक सूचना का उत्सर्जन करता है, क्योंकि दोनों makeऔर echoकमांड makeअलग-अलग उत्सर्जन से चलते हैं । उदाहरण के लिए, जब मैं make CC=echo helloएक निर्देशिका में चलता हूं जिसमें hello.cकोई मेकफाइल नहीं है, तो मुझे echo hello.c -o helloआउटपुट की पहली पंक्ति और hello.c -o helloदूसरी के रूप में मिलती है । लेकिन कुछ बिल्ड उपयोग (या उपयोगकर्ता जोड़ सकते हैं) -s, और फिर यह सहायक है। make -s CC=echo helloबस देता है hello.c -o hello
एलियाह कगन

(जो अभी भी उपयोगी हो सकता है यदि कमांड में शेल विस्तार शामिल है, तो आप स्पष्ट विचार प्राप्त कर सकते हैं कि क्या चल रहा है, यदि रुचि है)
muru

5

आप हमेशा अपनी खुद की कमांड बना सकते हैं जो शून्य निकास स्थिति को छोड़कर कुछ भी नहीं करता है। कुछ विकल्प:

  • उचित रूप से प्रतीकात्मक लिंक का नाम दिया गया है /bin/true

  • एक खाली शेल स्क्रिप्ट

  • लगभग खाली सी कार्यक्रम:

    int main() {
        return 0;
    }

इस तरह के एक कार्यक्रम के लिए एक अच्छा नाम नोप या नो-ऑप होगा।
arp

0

कार्य निर्देशिका में एक प्रतीकात्मक लिंक बनाएं / बिन / सच जैसे नाम skip। इस प्रकार ...

skip -> /bin/true

फिर मेक लाइन हो सकती है ...

make TOOL=./skip

-2

यहाँ इसे थोड़ा और पात्रों के साथ करने का एक तरीका दिया गया है:

function T() { /bin/true; }

आपके द्वारा इसे पूरा करने के बाद, आप इसे केवल नाम का उपयोग करके फिर से निष्पादित कर सकते हैं T

false; T; echo $?

3
क्या आप बता सकते हैं कि इस फ़ंक्शन को मेक वैरिएबल वैल्यू (प्रश्न की स्थिति में उपयोग करने के लिए) से कैसे प्राप्त किया जा सकता है?
डेविड फ़ॉस्टर
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.