मेकफाइल में फ़ाइल फ़ंक्शन '@' प्रतीक द्वारा उपसर्गों को लेता है


10

यह कोड अंश GNU मेकफाइल मैनुअल के अध्याय 8.6 से है।

मेकफाइल में फाइल फंक्शन arg के लिए @ $ @? का क्या मतलब है? और क्यों rm जैसे शेल कमांड उपसर्गों में '@' प्रतीक के द्वारा होते हैं

program: $(OBJECTS)
     $(file >$@.in,$^)
     $(CMD) $(CMDFLAGS) @$@.in
     @rm $@.in

फ़ाइल फ़ंक्शन सिंटैक्स है

$(file op filename[,text])
make 

जवाबों:


9

यहाँ तीन असंबंधित उपयोग @हैं।

में $@, वर्ण @एक स्वचालित चर का नाम है जिसका उपयोग किसी नियम में किया जा सकता है। उस चर का मान लक्ष्य है जो नियम बना रहा है।

जब @एक नुस्खा (कमांड) लाइन की शुरुआत में उपयोग किया जाता है, तो टैब वर्ण के बाद, यह कमांड को मुद्रित नहीं होने का कारण बनता है जब इसे निष्पादित किया जाता है।

चरित्र @कहीं और विशेष नहीं है।

इस प्रकार, आपके उदाहरण में, निर्माण करने के लिए program:

  1. fileसमारोह शुरू हो जाती है। यह $^फ़ाइल पर लक्ष्य ( स्वचालित चर) की निर्भरता लिखता है program.in
  2. वेरिएबल में जो भी कमांड स्टोर की जाती CMDहै, उसे एक्जीक्यूट किया जाता है, वेरिएबल में स्टोर किए गए मापदंडों के CMDFLAGSसाथ, अतिरिक्त पैरामीटर @program.in। यह क्या करता है इस पर निर्भर करता CMDहै।

  3. rm program.inपहले इसे प्रिंट किए बिना, कमांड को निष्पादित किया जाता है।

कुछ कमांड एक पैरामीटर का इलाज करते हैं @जो एक फाइल के संकेत के साथ शुरू होता है जिसमें से अधिक पैरामीटर पढ़ने के लिए। यह एक डॉस कन्वेंशन है जिसके बारे में आया था क्योंकि डॉस की कमांड लाइन की लंबाई पर एक कठोर सीमा थी और कमांड लाइन में कमांड के आउटपुट को इंटरपोल करने का कोई तरीका नहीं था। यह यूनिक्स की दुनिया में असामान्य है क्योंकि यूनिक्स में ये सीमाएँ नहीं हैं। नुस्खा के प्रभाव इस प्रकार के रूप में ही संभावना है

$(CMD) $(CMDFLAGS) $(OBJECTS)

2

@ लाइन में उपसर्ग लाइन की गूंज को दबाता है ।

डिफ़ॉल्ट रूप से, निष्पादित होने makeसे Makefileपहले प्रत्येक पंक्ति को प्रिंट करता है। जब लाइनें शुरू होती हैं @, तो वे लाइनें प्रिंट नहीं होंगी।

इसके बिना @:

$ cat > Makefile
hello:                                                                          
    echo hello world
$ make hello
echo hello world
hello world

के साथ @:

$ cat > Makefile
hello:                                                                          
    @echo hello world
$ make hello
hello world

एक नोट जो केवल @लाइन की शुरुआत में गूंज का कारण बनता है । >$@.inया @$@.inबस सामान्य तार हैं, और $@इसमें विस्तार किया जाएगा:

$ cat hello
hello:
    @echo @$@.in
$make hello
@hello.in

यह उत्तर नहीं कहता है, >$@.inफ़ाइल मोड के रूप में क्यों उपयोग किया जाता है ... लेकिन यह अपने तरीके से उपयोगी है .. धन्यवाद cuonglm ...
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.