* শেলস এর ব্যাকটিকস (অর্থাত্ `সেমিডি`) হ্রাস করা হয়েছে?


118

আমি ইউনিক্স এবং লিনাক্সের পাশাপাশি বাশ ও জেডএস-এর মতো শেলগুলির ক্ষেত্রে "ব্যাকটিক্স অবহেলা করা হয়েছে" শব্দবন্ধ ব্যবহার করে এমন অন্যান্য সাইটগুলিতে এই মন্তব্যটি বহুবার দেখেছি।

এই বিবৃতি সত্য না মিথ্যা?


দেখুন একটি শেল স্ক্রিপ্ট-এ কোট ব্যাক করা হয়নি কেন আমাকে সাহায্য cdএকটি ডিরেক্টরিতে কেন উদাহরণের জন্য $(...)স্বরলিপি নেস্টেড ব্যাক কোট ছাড়া ব্যবহার করা সহজ।
জোনাথন লেফলার


1
কমপক্ষে একটি ইউনিক্স, এআইএক্স, নথিভুক্ত করেছে যে ব্যাকটিকগুলি অপ্রচলিত । "যদিও ব্যাককোট সিনট্যাক্সটি কেএস দ্বারা স্বীকৃত হয়েছে, তবে এটি এক্স / ওপেন পোর্টেবিলিটি গাইড ইস্যু 4 এবং পসিক্স মান দ্বারা অপ্রচলিত হিসাবে বিবেচিত হয়। এই মানগুলি পোর্টেবল অ্যাপ্লিকেশনগুলি $ (কমান্ড) বাক্য গঠন ব্যবহার করার পরামর্শ দেয়।" আইবিএম.com
ক্রিস্টোফার

ম্যাক 10.10 তে "জিএনইউ ব্যাশ, সংস্করণ 3.2.57 (1) -রিলেজ (x86_64-আপেল-ডারউইন 14)" এ আমার একটি স্পষ্ট পার্থক্য রয়েছে: matchingLines=$( grep -n '\$-PARAMETER' ... | ... )কাজ করে, কাজ matchingLines= backtick the same stuff backtickকরে না - ব্যাকস্ল্যাশ-ডলারের ব্যাকস্ল্যাশ হারাতে দেখা যাচ্ছে। (এটি আমার স্ক্রিপ্ট নয় ...)
ডিসেম্বর

উত্তর:


126

"অবচয়" এর দুটি আলাদা অর্থ রয়েছে।

অবমূল্যায়ন করা হবে: (মূলত একটি সফ্টওয়্যার বৈশিষ্ট্য) কার্যকর হতে পারে তবে অপ্রচলিত এবং সেরা এড়ানো হিসাবে বিবেচিত হয়, সাধারণত বরখাস্ত হওয়ার কারণে।

Oxনিউজ অক্সফোর্ড আমেরিকান ডিকশনারি

এই সংজ্ঞা দ্বারা ব্যাকটিকগুলি হ্রাস করা হয়

অবহেলিত স্থিতিটি ভবিষ্যতে বৈশিষ্ট্যটি সরানো হবে তাও নির্দেশ করতে পারে।

- উইকিপিডিয়া

এই সংজ্ঞা দ্বারা ব্যাকটিকগুলি হ্রাস করা হয় না

এখনও সমর্থিত:

Citing উপর শেল কমান্ড ভাষাসমূহ ওপেন গ্রুপ স্পেসিফিকেশন , নির্দিষ্টভাবে অধ্যায় "2.6.3 কমান্ড উপকল্পন," এটা দেখা যায় যে, ব্যাকটিক (কমান্ড প্রতিকল্পন উভয় ফর্ম `..cmd..`) অথবা ডলার ডান বন্ধনী ( $(..cmd..)) এখনও যতটুকু সমর্থিত যেমন স্পেসিফিকেশন যায়।

উদ্ধৃতাংশ

কমান্ড প্রতিস্থাপন কমান্ডের নামের পরিবর্তে একটি কমান্ডের আউটপুট প্রতিস্থাপন করতে দেয়। কমান্ড প্রতিস্থাপন ঘটবে যখন কমান্ডটি নিম্নরূপে আবদ্ধ থাকে:

          $(command)

          or (backquoted version):

          `command`

শেলটি সাব-শেল এনভায়রনমেন্ট (শেল এক্সিকিউশন এনভায়রনমেন্ট দেখুন) কমান্ড সাবস্টিটিউশন (কমান্ডের টেক্সট প্লাস এনক্লোজিং $()বা ব্যাককোটিস) এর পরিবর্তে এক বা একাধিক ক্রম সরিয়ে কমান্ড প্রতিস্থাপনকে প্রসারিত করবে বিকল্পের শেষে <নিউলাইন> অক্ষর। আউটপুট শেষ হওয়ার আগে এম্বেড করা <নিউলাইন> অক্ষরগুলি সরানো হবে না; তবে, ফিল্ড বিভাজনের সময় এগুলিকে ফিল্ড ডিলিমিটার হিসাবে বিবেচনা করা যেতে পারে এবং আইএফএসের মান এবং কার্যকরভাবে উদ্ধৃত হওয়া উদ্ধৃতির উপর নির্ভর করে ক্ষেত্র বিভাজনের সময় নির্মূল করা যেতে পারে। যদি আউটপুটে কোনও নাল বাইট থাকে তবে আচরণটি অনির্দিষ্ট।

কমান্ড প্রতিস্থাপনের ব্যাককোটিড স্টাইলের মধ্যে, <ব্যাকস্ল্যাশ> এর আক্ষরিক অর্থ ধরে রাখতে হবে, কেবল তার পরে তা অনুসরণ করা হবে: '$', ' \`', বা <ব্যাকস্ল্যাশ> । মিলে যাওয়া ব্যাককোটির জন্য অনুসন্ধানটি প্রথম অনাবৃত অ-পালানো ব্যাককোট দ্বারা সন্তুষ্ট হবে; এই অনুসন্ধানের সময়, যদি শেল মন্তব্য, একটি এখানে-নথি, $(command)ফর্মের এমবেডড কমান্ড প্রতিস্থাপন , বা উদ্ধৃত স্ট্রিংয়ের মধ্যে যদি কোনও অব্যাহতিপ্রাপ্ত ব্যাককোটের মুখোমুখি হয় তবে অপরিজ্ঞাত ফলাফল আসে। একটি একক-উদ্ধৃত বা ডাবল-কোটেড স্ট্রিং শুরু হয়, তবে শেষ হয় না, `...`ক্রমটির মধ্যেই অপরিবর্তিত ফলাফল আসে।

সঙ্গে $(command)ফর্ম, ম্যাচিং সমাপনী প্রথম বন্ধনী খোলা প্রথম বন্ধনী নিম্নলিখিত সমস্ত অক্ষর কমান্ড গঠন করে। কোনও বৈধ শেল স্ক্রিপ্ট কমান্ডের জন্য ব্যবহার করা যেতে পারে, কেবলমাত্র পুনর্নির্দেশের সমন্বিত কোনও স্ক্রিপ্ট যা অনির্দিষ্ট ফলাফল দেয়।

তাহলে কেন সবাই বলছেন যে ব্যাকটিকগুলি হ্রাস করা হয়েছে?

কারণ বেশিরভাগ ব্যবহারের ক্ষেত্রে ব্যাকটিকের পরিবর্তে ডলারের প্যারেন ফর্মটি ব্যবহার করা উচিত । (উপরের প্রথম অর্থে অবজ্ঞাত।) সর্বাধিক নামী সাইটগুলি (ইউঅ্যান্ডএল সহ) প্রায়শই এটি বর্ণনা করে, তাই এটি দুর্দান্ত পরামর্শ। এই পরামর্শটি শেল থেকে ব্যাকটিক্সের জন্য সমর্থন অপসারণ করার জন্য কিছু অস্তিত্বহীন পরিকল্পনার সাথে বিভ্রান্ত হওয়া উচিত নয়।

  • বাশফাক # 082 - কেন $ (...) `...` (ব্যাকটিক্স) এর চেয়ে বেশি পছন্দ?

    উদ্ধৃতাংশ

    `...`নন-পসিক্স-সামঞ্জস্যপূর্ণ বোর্ন শেলগুলির মধ্যে কেবল অতি প্রাচীনতমের জন্য প্রয়োজনীয় লিগ্যাসি সিনট্যাক্স। সর্বদা $(...)সিনট্যাক্স পছন্দ করার বিভিন্ন কারণ রয়েছে :

    ...

  • বাশ হ্যাকার উইকি - অপ্রচলিত এবং অবচিত সিনট্যাক্স

    উদ্ধৃতাংশ

    এটি কমান্ড প্রতিস্থাপনের পুরানো বোর্ন-সামঞ্জস্যপূর্ণ ফর্ম । উভয় `COMMANDS`এবং $(COMMANDS)সিনট্যাক্সগুলি পসিক্স দ্বারা নির্দিষ্ট করা হয়েছে, তবে পরবর্তীটি বেশিরভাগ ক্ষেত্রেই পছন্দ করা হয়, যদিও পূর্বসূরি দুর্ভাগ্যক্রমে এখনও স্ক্রিপ্টগুলিতে খুব প্রচলিত। নতুন স্টাইলের কমান্ড বিকল্পগুলি প্রতিটি আধুনিক শেল (এবং তারপরে কিছু) দ্বারা ব্যাপকভাবে প্রয়োগ করা হয়। ব্যাকটিক্স ব্যবহারের একমাত্র কারণ হ'ল আসল বোর্ন শেলের (হেরলুমের মতো) সাথে সামঞ্জস্যতা। ব্যাকটিক কমান্ড প্রতিস্থাপনের জন্য নেস্ট করা হলে বিশেষ পালানোর প্রয়োজন হয় এবং বন্যের মধ্যে পাওয়া উদাহরণগুলি যথাযথভাবে উদ্ধৃত হয় না often দেখুন: কেন $ (...) ... ... `(ব্যাকটিক্স) এর চেয়ে বেশি পছন্দ করা হচ্ছে?

  • পসিক্স স্ট্যান্ডার্ড যুক্তি

    উদ্ধৃতাংশ

    এই অসামঞ্জস্যপূর্ণ আচরণের কারণে, নতুন অ্যাপ্লিকেশনগুলির জন্য নীচে কমান্ডের বিকল্প বা জটিল স্ক্রিপ্টগুলি এম্বেড করার চেষ্টা করার জন্য কমান্ড প্রতিস্থাপনের ব্যাককোটিড বিভিন্ন প্রস্তাব দেওয়া হয় না।

দ্রষ্টব্য: এই তৃতীয় অংশটি (উপরে) বেশ কয়েকটি পরিস্থিতি প্রদর্শন করতে চলেছে যেখানে ব্যাকটিকগুলি কেবল কাজ করবে না, তবে নতুন ডলার প্যারেন্স পদ্ধতিটি নিম্নলিখিত অনুচ্ছেদে শুরু করে:

অতিরিক্তভাবে, ব্যাককোয়াট সিনট্যাক্সের এম্বেড করা কমান্ডের সামগ্রীতে historicalতিহাসিক বিধিনিষেধ রয়েছে। যদিও নতুন "$ ()" ফর্মটি যে কোনও ধরণের বৈধ এম্বেড থাকা স্ক্রিপ্টটি প্রক্রিয়া করতে পারে, ব্যাককোটিড ফর্মটি এমন কিছু বৈধ স্ক্রিপ্টগুলি পরিচালনা করতে পারে না যাতে ব্যাককোটগুলি অন্তর্ভুক্ত থাকে।

আপনি যদি এই বিভাগটি পড়া চালিয়ে যান তবে ব্যর্থতাগুলি কীভাবে ব্যাকটিকগুলি ব্যবহার করতে ব্যর্থ হবে তা হাইলাইট করা হয় তবে নতুন ডলার প্যারেনস স্বরলিপি ব্যবহার করে কাজ করেন।

উপসংহার

সুতরাং আপনি ব্যাকটিক্সের পরিবর্তে ডলারের প্যারেন ব্যবহার করা পছন্দনীয় তবে আপনি প্রযুক্তিগতভাবে "অবহেলিত" এমন কিছু ব্যবহার করছেন না যেমন "পরিকল্পিত কিছু সময়ে এটি পুরোপুরি কাজ করা বন্ধ করে দেবে।"

এই সমস্ত কিছু পড়ার পরে আপনার অব্যাহতি নিতে হবে যে আপনি ডলার প্যারেন ব্যবহার করার জন্য উত্সাহিত হয়েছেন যদি না আপনি নির্দিষ্টভাবে একটি আসল মূল নন-পসিক্স বোর্ন শেলের সাথে সামঞ্জস্যতার প্রয়োজন হয়।


26
দ্বারা শব্দের অর্থ অধিকাংশ অবচিত , আমি (এবং আপনি) বলতে হবে যে ব্যাকটিক হয় অবচিত। এটি বেশিরভাগ পরিভাষার প্রশ্ন question
স্টাফেন চেজেলাস

4
@ স্টাফেনচাজেলাস - সম্মত! আমি পিপিএলকে বলতেই থাকব যে তারা অবচিত হয়ে গেছে তবে ব্যাকটিকগুলি আনুষ্ঠানিকভাবে "অবচয়" করা হয়নি যে তারা অদূর ভবিষ্যতে যে কোনও শেলের কোড বেস থেকে সক্রিয়ভাবে সরিয়ে নেওয়া হবে। কমপক্ষে কেউই আমি অবগত নই।
SLM

3
আমার ব্যাখ্যাটি হ'ল ব্যাককোটগুলি খাঁটিভাবে সমর্থন করা হয় কারণ তারা প্রচলিত কোডটিতে আনুষ্ঠানিকভাবে হ্রাস করার পক্ষে খুব বেশি জড়িত। এগুলি নতুন কোডে ব্যবহার করা চালিয়ে যাওয়ার পক্ষে আমি কোনও যুক্তি শুনিনি।
চিপনার

3
@ এসএমএল হ্যাঁ, আমি অনুমান করি আপনি এটি পেয়েছেন - আমি টেনে নিয়ে গিয়েছি এবং খেয়াল করি না। এই জিনিসগুলি ব্যবহার করার প্রায় কোনও কারণ নেই, কেবল সাবার শিকাগুলি স্থাপনের সময় এটি কেবলমাত্র একটু ক্লিনার হতে পারে তাই এটি পড়ার $( cmd `cmd`)চেয়ে $( cmd $(cmd))সহজ - আমি সবেমাত্র সফ্টওয়্যারটিতে একটি অবজ্ঞাত বৈশিষ্ট্যটিকে প্রবাহের দ্বারা সরানোর জন্য সরকারীভাবে চিহ্নিত হিসাবে বিবেচনা করেছি - এবং আমি এর আগে কখনও শুনিনি। আমি যত্ন করি না - কবরের প্রতি ভালবাসা নেই।
মাইকজার্ভ

3
আপনি পসিক্স স্ট্যান্ডার্ড যুক্তি থেকে নিম্নলিখিত উদ্ধৃতিটি যুক্ত করতে চাইতে পারেন : এই অসঙ্গত আচরণের কারণে, কমান্ড প্রতিস্থাপন বা জটিল স্ক্রিপ্টগুলি এম্বেড করার চেষ্টা করে এমন নতুন অ্যাপ্লিকেশনগুলির জন্য ব্যাককোটেড বিভিন্ন কমান্ড প্রতিস্থাপনের প্রস্তাব দেওয়া হয় না। যদিও এটি কোনও আনুষ্ঠানিক অবমূল্যায়ন নয় কারণ যুক্তি বিভাগটি তথ্যবহুল এবং আদর্শিক নয়, এটি প্রস্তাব দেয় যে ব্যাকটিক্সের অবিচ্ছিন্ন ব্যবহার এড়ানো উচিত।
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
  • ব্যাককোটগুলি ব্যবহার করার সময় এটি বেমানান আচরণের একটি সমস্যা সমাধান করে:

    • echo '\$x' আউটপুট \$x
    • echo `echo '\$x'` আউটপুট $x
    • echo $(echo '\$x') আউটপুট \$x
  • ব্যাকটিক্স সিনট্যাক্সের এম্বেড থাকা কমান্ডের বিষয়বস্তুতে historicalতিহাসিক বিধিনিষেধ রয়েছে এবং ব্যাককোটগুলি অন্তর্ভুক্ত করে এমন কিছু বৈধ স্ক্রিপ্টগুলি পরিচালনা করতে পারে না, যখন নতুন $()ফর্মটি কোনও প্রকারের বৈধ এম্বেডড স্ক্রিপ্ট প্রক্রিয়া করতে পারে।

    উদাহরণস্বরূপ, এই অন্যথায় বৈধ এম্বেড থাকা স্ক্রিপ্টগুলি বাম কলামে কাজ করে না, তবে ডান আইইইইতে কাজ করবে :

    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 ')'
    `                              )

অতএব- $প্রিফিক্সড কমান্ড প্রতিস্থাপনের জন্য সিনট্যাক্সটি পছন্দসই পদ্ধতি হওয়া উচিত, কারণ এটি পরিষ্কার সিনট্যাক্স (মানব এবং মেশিনের পাঠ্যতা উন্নত করে) দ্বারা দৃশ্যত পরিষ্কার, এটি নীড় এবং স্বজ্ঞাত, এর অভ্যন্তরীণ পার্সিং পৃথক, এবং এটি আরও সুসংগত (সাথে অন্যান্য সমস্ত বিস্তৃতি যা ডাবল-কোটের মধ্যে পার্স করা হয়) যেখানে ব্যাকটিকগুলি একমাত্র ব্যতিক্রম এবং `চরিত্রটি সহজেই ছদ্মবেশে পড়ে যখন "এটি পড়তে আরও বেশি কঠিন করে তোলে, বিশেষত ছোট বা অস্বাভাবিক ফন্টের সাহায্যে।

উত্স: কেন (ব্যাকটিক্স) $(...)বেশি পছন্দ করা হয় `...`? বাশফ্যাকু তে

আরো দেখুন:

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.