* शेल्स में * बैकटिक्स (यानी `cmd`) को हटा दिया गया है?


118

मैंने यह टिप्पणी कई बार यूनिक्स और लिनक्स के साथ-साथ अन्य साइटों पर भी की है, जो बैश एंड ज़ेड जैसे गोले के संबंध में "बैकटिक्स को हटा दिया गया है" का उपयोग करते हुए वाक्यांशों का उपयोग करते हैं।

यह कथन सही है या गलत?


देखें कि शेल स्क्रिप्ट में उद्धरण वापस क्यों नहीं आएcd , उदाहरण के लिए निर्देशिका में मेरी मदद$(...) करें कि नेस्टेड बैक-कोट्स की तुलना में नोटेशन का उपयोग करना आसान क्यों है।
जोनाथन लेफ़लर


1
कम से कम एक यूनिक्स, एआईएक्स, ने प्रलेखित किया है कि बैकटिक्स अप्रचलित हैं । "हालांकि बैकक्वाइन सिंटैक्स को ksh द्वारा स्वीकार किया जाता है, इसे X / Open पोर्टेबिलिटी गाइड इश्यू 4 और POSIX मानकों द्वारा अप्रचलित माना जाता है। ये मानक अनुशंसा करते हैं कि पोर्टेबल एप्लिकेशन $ (कमांड) सिंटैक्स का उपयोग करें।" ibm.com/support/knowledgecenter/ssw_aix_71/com.ibm.aix.osdevice/…
क्रिस्टोफर

मैक 10.10 पर "GNU बैश, संस्करण 3.2.57 (1) -release (x86_64-apple-darwin14)" में मेरा एक निश्चित अंतर है: matchingLines=$( grep -n '\$-PARAMETER' ... | ... )काम करता है, matchingLines= backtick the same stuff backtickकाम नहीं करता - बैकस्लैश-डॉलर में बैकस्लैश को खोना लगता है। (यह मेरी स्क्रिप्ट नहीं है ...)
डेविस 12

जवाबों:


126

"पदावनत" के दो अलग-अलग अर्थ हैं।

पदावनत होना: (मुख्यतः एक सॉफ्टवेयर सुविधा के) प्रयोग करने योग्य है लेकिन इसे अप्रचलित और सबसे अच्छा माना जाता है, आमतौर पर इसे लेट होने के कारण।

-नई ऑक्सफोर्ड अमेरिकन डिक्शनरी

इस परिभाषा के अनुसार बैकटिक्स को हटा दिया गया है।

अस्वीकृत स्थिति यह संकेत दे सकती है कि भविष्य में यह सुविधा हटा दी जाएगी।

- विकिपीडिया

इस परिभाषा के अनुसार बैकटिक्स को पदावनत नहीं किया जाता है।

अभी भी समर्थित:

शेल कमांड लैंग्वेज पर ओपन ग्रुप स्पेसिफिकेशन का हवाला देते हुए , विशेष रूप से "2.6.3 कमांड सब्स्टीट्यूशन" अनुभाग, यह देखा जा सकता है कि विनिर्देशन के जाते ही कमांड प्रतिस्थापन, बैकटिक्स ( `..cmd..`) या डॉलर पार्न्स ( $(..cmd..)) के दोनों रूप अभी भी समर्थित हैं।

अंश

कमांड प्रतिस्थापन एक कमांड के आउटपुट को कमांड नाम के स्थान पर प्रतिस्थापित करने की अनुमति देता है। कमांड प्रतिस्थापन तब होगा जब कमांड निम्नानुसार संलग्न है:

          $(command)

          or (backquoted version):

          `command`

शेल एक सबहेल्ड वातावरण में कमांड निष्पादित करके कमांड प्रतिस्थापन का विस्तार करेगा (शेल एक्ज़ेक्यूशन एनवायरनमेंट देखें) और कमांड प्रतिस्थापन (कमांड का पाठ प्लस $()संलग्नक या बैकक्ओट्स) को कमांड के मानक आउटपुट के साथ बदलकर , एक या एक से अधिक को हटाकर। प्रतिस्थापन के अंत में <newline> अक्षर। एंबेडेड <newline> आउटपुट समाप्त होने से पहले वर्ण हटाए नहीं जाएंगे; हालाँकि, उन्हें क्षेत्र के सीमांकक के रूप में माना जा सकता है और क्षेत्र विभाजन के दौरान समाप्त किया जा सकता है, जो कि IFS के मूल्य और प्रभाव में है। यदि आउटपुट में कोई नल बाइट्स है, तो व्यवहार अनिर्दिष्ट है।

आदेश प्रतिस्थापन के पीछे की शैली के भीतर, <backslash> इसके शाब्दिक अर्थ को बनाए रखेगा, इसके अलावा जब: '$', ' \`', या <backslash> । मिलान किए गए बैककौट की खोज पहले अनकैप्ड गैर-एस्केप बैककोट से संतुष्ट होगी; इस खोज के दौरान, यदि एक गैर-बच गए बैककॉट का शेल टिप्पणी के भीतर सामना किया जाता है, तो यहां एक दस्तावेज, $(command)फॉर्म का एक एम्बेडेड कमांड प्रतिस्थापन , या एक उद्धृत स्ट्रिंग, अपरिभाषित परिणाम होते हैं। एकल-उद्धृत या डबल-उद्धृत स्ट्रिंग जो शुरू होती है, लेकिन समाप्त नहीं होती है, " `...`" अनुक्रम के भीतर अपरिभाषित परिणाम पैदा करता है।

$(command)फ़ॉर्म के साथ , खुले कोष्ठक के मिलान समापन कोष्ठक के बाद सभी वर्ण कमांड का गठन करते हैं। किसी भी मान्य शेल स्क्रिप्ट का उपयोग कमांड के लिए किया जा सकता है, केवल एक स्क्रिप्ट को छोड़कर जिसमें पुन: दिशा-निर्देश होते हैं जो अनिर्दिष्ट परिणाम उत्पन्न करता है।

तो फिर हर कोई यह क्यों कहता है कि बैकटिक्स को हटा दिया गया है?

क्योंकि अधिकांश उपयोग के मामलों में बैकटिक्स के बजाय डॉलर पार्न्स फॉर्म का उपयोग किया जाना चाहिए । (ऊपर के पहले अर्थ में पदावनत।) कई सम्मानित साइटें (यू एंड एल सहित) अक्सर इसे पूरे राज्य में भी प्रस्तुत करती हैं, इसलिए यह ध्वनि सलाह है। गोले से बैकटिक्स के लिए समर्थन को हटाने के लिए कुछ गैर-मौजूद योजना के साथ इस सलाह को भ्रमित नहीं किया जाना चाहिए।

  • BashFAQ # 082 - $ (...) को '...' (बैकटिक्स) क्यों पसंद किया जाता है?

    अंश

    `...`गैर-पोसिक्स-संगत बोर्न-शेल के केवल सबसे पुराने द्वारा आवश्यक विरासत सिंटैक्स है। $(...)वाक्यविन्यास को हमेशा पसंद करने के कई कारण हैं :

    ...

  • बैश हैकर्स विकी - अप्रचलित और हटाए गए वाक्यविन्यास

    अंश

    यह कमांड प्रतिस्थापन का पुराना बॉर्न-संगत रूप है । दोनों `COMMANDS`और $(COMMANDS)वाक्यविन्यास POSIX द्वारा निर्दिष्ट कर रहे हैं, लेकिन बाद है बहुत , वरीय हालांकि पूर्व दुर्भाग्य से अभी भी स्क्रिप्ट में बहुत प्रचलित है। नई शैली के कमांड प्रतिस्थापन हर आधुनिक शेल (और फिर कुछ) द्वारा व्यापक रूप से लागू किए जाते हैं। बैकटिक्स का उपयोग करने का एकमात्र कारण एक असली बॉर्न शेल (जैसे हीरलूम) के साथ संगतता के लिए है। बैकटिक कमांड सबस्टेशनों को नेस्टेड होने पर विशेष भागने की आवश्यकता होती है, और जंगली में पाए जाने वाले उदाहरणों को अनुचित रूप से अधिक बार उद्धृत किया जाता है। देखें: $ (...) को '...' (बैकटिक्स) क्यों पसंद किया जाता है?

  • POSIX मानक तर्क

    अंश

    इन असंगत व्यवहारों के कारण, नए अनुप्रयोगों के लिए कमांड प्रतिस्थापन की सिफारिश नहीं की जाती है, जो जटिल स्क्रिप्ट्स को एंबेड करने या प्रयास करने के लिए घोंसला आदेश देता है।

नोट: यह तीसरा अंश (ऊपर) कई स्थितियों को दिखाने के लिए जाता है जहां बैकटिक्स बस काम नहीं करेगा, लेकिन नए डॉलर के पार्न्स विधि निम्न पैराग्राफ के साथ शुरुआत करती है:

इसके अतिरिक्त, बैकअकोटेड सिंटैक्स में एम्बेडेड कमांड की सामग्री पर ऐतिहासिक प्रतिबंध हैं। हालांकि नया "$ ()" फ़ॉर्म किसी भी प्रकार की मान्य एम्बेडेड स्क्रिप्ट को संसाधित कर सकता है, लेकिन बैककोट का फॉर्म कुछ मान्य स्क्रिप्ट को संभाल नहीं सकता है जिसमें बैकलॉग शामिल हैं।

यदि आप पढ़ना जारी रखते हैं कि खंड विफलताओं को दिखा रहा है कि वे कैसे बैकटिक्स का उपयोग करने में विफल होंगे, लेकिन नए डॉलर के पार्स का उपयोग करके काम करें।

निष्कर्ष

इसलिए यह बेहतर है कि आप बैकटिक्स के बजाय डॉलर के पैरेन्स का उपयोग करें, लेकिन आप वास्तव में ऐसी किसी चीज का उपयोग नहीं कर रहे हैं जो तकनीकी रूप से "पदावनत" हो, जैसे कि "यह पूरी तरह से कुछ नियोजित बिंदु पर काम करना बंद कर देगा।"

यह सब पढ़ने के बाद आपको अपने पास ले जाना चाहिए कि जब तक आपको विशेष रूप से वास्तविक मूल गैर-पॉसिक्स बॉर्न शेल के साथ संगतता की आवश्यकता न हो, तब तक आपको डॉलर के पैरेन्स का उपयोग करने के लिए दृढ़ता से प्रोत्साहित किया जाए ।


26
तक के अर्थ के सबसे पदावनत , मैं (और आप) का कहना है कि बैकटिक रहे पदावनत। यह ज्यादातर एक शब्दावली का सवाल है।
स्टीफन चेज़लस

4
@ स्टेफ़ेनचेज़लस - सहमत! मैं पीपीएल बताना जारी रखूंगा कि वे पदावनत हैं लेकिन बैकटिक्स को आधिकारिक तौर पर इस तरह से "पदावनत" नहीं किया गया है कि वे निकट भविष्य में किसी भी शेल के कोड बेस से सक्रिय रूप से हटाए जाने वाले हैं। कम से कम कोई भी ऐसा नहीं है जिसके बारे में मैं जानता हूं।
SLM

3
मेरी व्याख्या यह है कि बैककौट्स को विशुद्ध रूप से समर्थन दिया जाता है क्योंकि वे मौजूदा कोड में बहुत औपचारिक रूप से पदावनत हो जाते हैं। मैंने उन्हें नए कोड में उपयोग करने के लिए जारी रखने का तर्क नहीं सुना है।
चेपनर

3
@ एसएलएम हाँ, मुझे लगता है कि आप इसे प्राप्त कर चुके हैं - मैंने दूर खींच लिया और ध्यान नहीं दिया। इन चीजों का उपयोग करने का लगभग कोई कारण नहीं है, सिवाय इसके कि यह केवल एक छोटा क्लीनर हो सकता है जब उप-स्तर रखना इतना $( cmd `cmd`)कम से कम थोड़ा गड़बड़ है $( cmd $(cmd))- यह पढ़ना आसान है। मैं हमेशा सॉफ्टवेयर में एक अपदस्थ सुविधा को एक माना जाता हूं, जिसे आधिकारिक तौर पर अपस्ट्रीम द्वारा हटाने के लिए चिह्नित किया जाता है - और मैंने ऐसा कभी नहीं सुना है। मुझे परवाह नहीं है - कब्र के लिए कोई प्यार नहीं है।
mikeserv

3
आप POSIX मानक औचित्य से निम्नलिखित उद्धरण जोड़ना चाह सकते हैं : इन असंगत व्यवहारों के कारण, नए अनुप्रयोगों के लिए कमांड प्रतिस्थापन का बैकएकोटेड विविधता अनुशंसित नहीं है जो कि नेस्ट कमांड प्रतिस्थापन या जटिल स्क्रिप्ट को एम्बेड करने का प्रयास करता है। हालांकि यह एक औपचारिक पदावनति नहीं है क्योंकि औचित्य अनुभाग जानकारीपूर्ण है और मानक नहीं है, यह सुझाव देता है कि बैकटिक्स के निरंतर उपयोग से बचा जाना चाहिए।
jw013

15

यह पदावनत नहीं किया गया है, लेकिन बैकटिक्स ( `...`) गैर-पोसिक्स-संगत बॉर्न-शेल के केवल सबसे पुराने द्वारा आवश्यक विरासत सिंटैक्स $(...)है और कई कारणों से पोसिक्स और अधिक पसंदीदा है:

  • बैकस्लैक्स ( \बैकस्टिक्स के अंदर) को गैर-स्पष्ट तरीके से नियंत्रित किया जाता है:

    $ echo "`echo \\a`" "$(echo \\a)"
    a \a
    $ echo "`echo \\\\a`" "$(echo \\\\a)"
    \a \\a
    # Note that this is true for *single quotes* too!
    $ foo=`echo '\\'`; bar=$(echo '\\'); echo "foo is $foo, bar is $bar" 
    foo is \, bar is \\
  • अंदर उद्धृत नेस्टिंग $()कहीं अधिक सुविधाजनक है:

    echo "x is $(sed ... <<<"$y")"

    के बजाय:

    echo "x is `sed ... <<<\"$y\"`"

    या कुछ लिखना:

    IPs_inna_string=`awk "/\`cat /etc/myname\`/"'{print $1}' /etc/hosts`

    क्योंकि $()उद्धृत करने के लिए एक पूरी तरह से नए संदर्भ का उपयोग करता है

    जो बोर्न और कॉर्न के गोले के रूप में पोर्टेबल नहीं है, उन्हें इन बैकस्लैश की आवश्यकता होगी, जबकि बैश और डैश नहीं।

  • नेस्टिंग कमांड प्रतिस्थापन के लिए सिंटैक्स आसान है:

    x=$(grep "$(dirname "$path")" file)

    से:

    x=`grep "\`dirname \"$path\"\`" file`

    क्योंकि $()उद्धृत करने के लिए एक पूरी तरह से नया संदर्भ लागू करता है, इसलिए प्रत्येक कमांड प्रतिस्थापन को संरक्षित किया जाता है और उद्धरण और भागने पर विशेष चिंता किए बिना अपने दम पर इलाज किया जा सकता है। बैकटिक्स का उपयोग करते समय, यह दो और ऊपर के स्तरों के बाद बदसूरत और बदसूरत हो जाता है।

    कुछ और उदाहरण:

    echo `echo `ls``      # INCORRECT
    echo `echo \`ls\``    # CORRECT
    echo $(echo $(ls))    # CORRECT
  • यह backquotes का उपयोग करते समय असंगत व्यवहार की समस्या को हल करता है:

    • echo '\$x' आउटपुट \$x
    • echo `echo '\$x'` आउटपुट $x
    • echo $(echo '\$x') आउटपुट \$x
  • बैकटिक्स सिंटैक्स में एम्बेडेड कमांड की सामग्री पर ऐतिहासिक प्रतिबंध हैं और कुछ मान्य स्क्रिप्ट को संभाल नहीं सकते हैं, जिसमें बैकक्वाटर शामिल हैं, जबकि नया $()रूप किसी भी प्रकार की वैध एम्बेडेड स्क्रिप्ट को संसाधित कर सकता है।

    उदाहरण के लिए, ये अन्यथा मान्य एम्बेडेड स्क्रिप्ट बाएं कॉलम में काम नहीं करते हैं, लेकिन दाईं ओर IEEE पर काम करते हैं :

    echo `                         echo $(
    cat <<\eof                     cat <<\eof
    a here-doc with `              a here-doc with )
    eof                            eof
    `                              )
    
    
    echo `                         echo $(
    echo abc # a comment with `    echo abc # a comment with )
    `                              )
    
    
    echo `                         echo $(
    echo '`'                       echo ')'
    `                              )

इसलिए $-प्रोटेक्टेड कमांड प्रतिस्थापन के लिए वाक्यविन्यास पसंदीदा तरीका होना चाहिए, क्योंकि यह साफ वाक्यविन्यास (मानव और मशीन की पठनीयता में सुधार) के साथ स्पष्ट रूप से स्पष्ट है, यह घोंसला बनाने योग्य और सहज है, इसकी आंतरिक पार्सिंग अलग है, और यह अधिक सुसंगत भी है (साथ अन्य सभी विस्तार जो डबल-कोट्स के भीतर से पार्स किए गए हैं) जहां बैकटिक्स एकमात्र अपवाद हैं और `चरित्र आसानी से छला जाता है जब "इसे पढ़ने के लिए और भी मुश्किल बना दिया जाता है, खासकर छोटे या असामान्य फोंट के साथ।

स्रोत: (बैकटिक्स) को क्यों $(...)पसंद किया जाता है `...`? BashFAQ पर

यह सभी देखें:

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