नया उर्फ ​​के बाद उपलब्ध नहीं;


9

अब तक मैंने सोचा था कि शेल में एक अर्धविराम का (किसी तरह) लाइन ब्रेक के समान अर्थ है। तो मैं हैरान था कि के लिए

alias <name>=<replacement text>; <name>

<name>अज्ञात है जबकि यह अगली पंक्ति में जाना जाता है। csh, tcsh, sh, kshऔर bashएक ही व्यवहार करते हैं। कम से कम इसके लिए cshकोई फर्क नहीं पड़ता कि अलियास को सीधे इस्तेमाल किया जाता है या यदि एक स्क्रिप्ट को सेमीकॉलन से पहले खट्टा किया जाता है - उपनाम के बाद ज्ञात नहीं हैं ;लेकिन अगले कमांड लाइन में जाने जाते हैं। क्या यह बग है या यह व्यवहार उद्देश्यपूर्ण है?


"मैंने सोचा कि शेल में एक अर्धविराम (किसी तरह) का एक लाइन ब्रेक के समान अर्थ है" लगभग। काफी नहीं!
ऑर्बिट

1
अर्धविराम और न्यूलाइन की व्याख्या इस बात पर निर्भर करती है कि पार्सर को कैसे कहा जाता है। "डॉट" कमांड के लिए, बॉर्न शेल "एनएलएफएलजी" के साथ पार्सर को बुलाता है जो इसे कुछ स्थितियों में न्यूलाइन और अर्धविराम के बराबर इलाज करने के लिए कहता है, लेकिन यह कहीं और नहीं है। सामान्य तौर पर, अर्धविराम और लाइनब्रेक समान नहीं होते हैं क्योंकि आपके पास एक लाइनब्रेक हो सकता है, जहां अर्धविराम एक वाक्यविन्यास त्रुटि का कारण होगा।
शास्त्री

जवाबों:


9

आपके द्वारा उपयोग किया जा रहा अन्य उपनाम सिंटैक्स POSIX शेल के लिए अनुचित है, POSIX शेल के लिए, आपको उपयोग करने की आवश्यकता है:

alias name='replacement'

लेकिन सभी गोले के लिए, यह काम नहीं कर सकता क्योंकि उर्फ ​​प्रतिस्थापन जल्दी से पार्सर में किया जाता है।

आपके उपनाम सेटअप को निष्पादित करने से पहले, पूरी पंक्ति पार्सर द्वारा पढ़ी गई थी और इस कारण से, आपकी कमांड लाइन wil काम नहीं कर रही थी।

यदि अगली कमांड लाइन पर उपनाम दिखाई देता है, तो यह काम करेगा।


इसके अलावा, कुछ गोले भी उर्फ ​​का विस्तार नहीं करेंगे yashया zshनहीं करेंगे shell -c 'alias name=replacement<newline>replacement'। AT & T के लिए ksh, आपको खट्टी-मीठी लिपियों की समस्या होगी ।
स्टीफन चेज़लस

मुझे इस मामले में csh का उपयोग करने की आवश्यकता है - सिंटैक्स =में कोई उपयोग नहीं किया गया है alias
user3224237

@ user3224237 - इससे कोई लेना-देना नहीं है =। ऐसा इसलिए है क्योंकि उपनाम का विस्तार तब होता है जब शेल पहली बार लाइन को देखता है, जो कि आपको उपनाम को परिभाषित करने से पहले है
कैस

@ स्टीफन चेज़लस "खट्टे" लिपियों के साथ व्यवहार इस तथ्य के कारण होता है कि बोर्न शेल पूरी तरह से निष्पादित होने से पहले ऐसी फ़ाइलों को पार्स करता है। Ksh बॉर्न शेल स्रोत पर आधारित है और जो कुछ भी नहीं बदला गया था वही व्यवहार करता है।
५५ पर विद्वान

@ सामान्य रूप से, हाँ, यह वही कारण है zsh/yash -c 'code'जहाँ codeएक पूरे के रूप में पार्स किया जाता है। यह बॉर्न शेल के मामले में प्रतीत नहीं होता है। तो मुझे लगता है कि बॉर्न शेल पार्स है कि codeएक समय में एक लाइन है।
स्टीफन चेजलस

5

यह व्यवहार POSIX द्वारा एलियास प्रतिस्थापन के तहत अभिप्रेत और निर्दिष्ट है ।

टोकन मान्यता प्राप्त करने और किसी भी व्याकरण नियमों को लागू करने से पहले एक उपनाम को सही तरीके से प्रतिस्थापित किया गया था । जिस समय आपने उपनाम कहा था <name>, कमांड aliasनिष्पादित नहीं की गई थी।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.