শেল প্রোগ্রামিংয়ে $ (কমান্ড) এবং `কমান্ডের মধ্যে পার্থক্য কী?


258

Sh / ksh / bash এ ভেরিয়েবল হিসাবে কমান্ডের আউটপুট সংরক্ষণ করতে আপনি এটি করতে পারেন

var=$(command)

অথবা

var=`command`

দুটি পদ্ধতির মধ্যে কোনও পার্থক্য কি?



গিট কোডিং গাইডলাইনে আপনি নেস্টেড ইস্যুটি বিশদটি পাবেন: নীচে আমার উত্তরটি দেখুন
ভোনসি

সম্পর্কিত: unix.stackexchange.com
জিজ্ঞাসা

উত্তর:


274

ব্যাকটিক্স / ক্রেমারমার্কগুলি $()কমান্ড প্রতিস্থাপনের পক্ষে হ্রাস করা হয়েছে কারণ $()সহজেই নিজের মধ্যে বাসা বাঁধতে পারে $(echo foo$(echo bar))। অন্যান্য পার্থক্য রয়েছে যেমন ব্যাকট্লিক / গ্র্যাথমার্ক সংস্করণে ব্যাকস্ল্যাশগুলি কীভাবে পার্স করা হয় ইত্যাদি are

সর্বদা $ (...) বাক্যবিন্যাসকে প্রাধান্য দেওয়ার জন্য বেশ কয়েকটি কারণের জন্য বাশফাক्यू / 082 দেখুন ।

বিভিন্ন পার্থক্য সম্পর্কে বিস্তারিত তথ্যের জন্য পসিক্স স্পেকও দেখুন ।


25
গুড লিংক, কিন্তু যে টেক্সট না অনুমোদন প্রত্যাহার পক্ষে backquotes $(...)- এটা শুধু বিকল্প তাদের নোট।
নরম্যান গ্রে

24
@NormanGray POSIX না বলতে পারে শব্দ অবচিত কিন্তু এটা বলা আছে "the backquoted variety of command substitution is not recommended"যা শুধু অবচিত য়ে এই প্রোগ্রামটিতে একটি দীর্ঘ বিরক্তিকর উপায়
SiegeX

11
পসিক্স ব্যাকটিক্সকে হ্রাস করে না, বরং $(...)বিকল্প পদ্ধতি হিসাবে যুক্ত করেছে । ব্যাকটিক্স সহ কোনও পরিচিত বাস্তবায়ন বাগ নেই, তবে এর সাথে অনেকগুলি বাস্তবায়ন বাগ রয়েছে $(...) । সুতরাং বহনযোগ্যতার সমস্যাগুলির জন্য অ-নেস্টেড কলগুলির জন্য ব্যাকটিকগুলি ব্যবহার করার পরামর্শ দেওয়া হচ্ছে। $(...)একটি পুনরাবৃত্ত পার্সার প্রয়োজন তবে এটি ksh86 এর সাথে ব্যবহৃত হয়নি যা বৈশিষ্ট্যটি প্রবর্তন করেছিল। সঠিক বাস্তবায়নের তালিকার জন্য ইন -ulm.de/~mascheck/various/cmd-subst দেখুন । একটি কনফার্মিং শেল ডি কেস কেস বাদে সমস্ত ক্ষেত্রে সমর্থন করা প্রয়োজন।
সহজেই

2
পসিএক্স-এ অন্যান্য জিনিস রয়েছে যা দেখা দরকার যেমন deprecated, উদাহরণস্বরূপ এর ব্যবহার waitpid()আপনাকে exit()প্যারামিটার থেকে পুরো 32 বিটগুলি দেখতে বাধা দেয় তবে সাম্প্রতিক বোর্ন শেল ব্যতীত সমস্ত শেল কলটির waitpid()পরিবর্তে এখনও ব্যবহার করছে waitid()যা এখন থেকে উপলব্ধ that 26 বছর।
সহজেই

উত্তরের লিঙ্কটি ইঙ্গিত দেয় যে ব্যাকটিক্সের মধ্যে কিছু পার্থক্য রয়েছে এবং $()যা ডকুমেন্টেশনের এই অংশে আরও ব্যাখ্যা করা হয়েছে । পার্থক্য কেবল বাসা বাঁধার বিষয় নয়।
কিছু প্রোগ্রামার ডুড

39

তারা একই আচরণ করে। পার্থক্যটি সিনট্যাক্টিকাল: এর $()চেয়ে বাসা বাঁধাই সহজ ``:

listing=$(ls -l $(cat filenames.txt))

বনাম

listing=`ls -l \`cat filenames.txt\``

10
echo $(echo \$abc)যেমনটি নয় echo `echo \$abc`‍- পার্থক্যগুলিও রয়েছে $(echo \`)এবং $(echo \\)
পিটার.ও

আর একটি পার্থক্য হ'ল echo foo `#comment`বনাম echo foo $(#comment)। দ্বিতীয়টি কাজ করে না। (একটি মাল্টি-লাইন কমান্ডে মন্তব্য করার জন্য ব্যবহৃত হয়েছে
উইসবুকি

27

জুলাই ২০১৪: প্রতিশ্রুতিবদ্ধ f25f5e6 ( এলিয়া পিন্টোdevzero2000 দ্বারা ) , এপ্রিল 2014, গিট 2.0

ব্যাককোটেড ফর্ম হ'ল কমান্ড প্রতিস্থাপনের traditionalতিহ্যগত পদ্ধতি এবং এটি পসিক্স দ্বারা সমর্থিত।
তবে, সহজ ব্যবহারগুলি ব্যতীত দ্রুত জটিল হয়ে ওঠে।
বিশেষত, এম্বেড করা কমান্ড বিকল্প এবং / অথবা ডাবল উদ্ধৃতি ব্যবহারের জন্য ব্যাকস্ল্যাশ অক্ষরের সাথে সাবধানতার সাথে পালিয়ে যাওয়া দরকার

যে কারণে গিট / ডকুমেন্টেশন / কোডিংগুইডলাইনস উল্লেখ করেছে:

আমরা $( ... )কমান্ড প্রতিস্থাপনের জন্য পছন্দ করি ; `unlike এর বিপরীতে, এটি সঠিকভাবে বাসা বাঁধে
প্রথম দিন থেকে বোর্ন যেভাবে বানানটি করেছিল তা হওয়া উচিত ছিল, তবে দুর্ভাগ্যক্রমে তা হয়নি।

থাইটন মন্তব্য করেছে :

এজন্য `echo `foo`` অন্তর্নিহিত অস্পষ্টতার কারণে সাধারণভাবে কাজ করবে না কারণ প্রত্যেকে ``খোলা বা বন্ধ হতে পারে।
এটি ভাগ্য বা বিশেষ বৈশিষ্ট্যের কারণে বিশেষ ক্ষেত্রে কাজ করতে পারে।


জানুয়ারী ২০১ 2016 আপডেট করুন: গিট ২.৮ (মার্চ ২০১)) পুরোপুরি ব্যাকটিক্স থেকে মুক্তি পেয়েছে।

দেখুন কমিট ec1b763 , 9c10377 কমিট , c7b793a কমিট , 80a6b3f কমিট , 9375dcf কমিট , e74ef60 কমিট , 27fe43e কমিট , কমিট 2525c51 , becd67f কমিট , a5c98ac কমিট , কমিট 8c311f9 , কমিট 57da049 , 1d9e86f কমিট , কমিট 78ba28d , efa639f কমিট , কমিট 1be2fa0 , কমিট 38e9476 , 8823d2f কমিট , 32858a0 কমিট , cd914d8 কমিট(12 জানুয়ারী 2016) এলিয়া পিন্টো ( devzero2000) দ্বারা
(দ্বারা একীভূত junio সি Hamano - gitster- মধ্যে e572fef কমিট , 22 জানুয়ারী 2016)

গিট ২.৮ এর পর থেকে, এটি এখন $(...)আর কিছুই নয় `...`


2
$()এছাড়াও পসিক্স-নির্দিষ্ট করা আছে - একটি উদ্ধৃতি যা ব্যাকটিকগুলি "POSIX- সমর্থিত" হিসাবে বর্ণনা করে যাতে বোঝায় যে এটি তাদের কাছে অনন্য is বিভ্রান্তিকর। এটি কেবলমাত্র (১৯s০-এর দশকের) প্রাক-পসিক্স বোর্ন যেখানে ব্যাকটিকগুলি একমাত্র সমর্থিত বাক্য গঠন।
চার্লস ডাফি

25

পুরানো ব্যাক-টিক ফর্মটি ব্যবহার করা হলে, ব্যাকস্ল্যাশ তার আক্ষরিক অর্থ ধরে রাখে followed, `, বা by অনুসরণ না করে \ ব্যাকস্ল্যাশ এর আগে না হওয়া প্রথম ব্যাক-টিকটি কমান্ড প্রতিস্থাপনের অবসান ঘটায়।

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

উভয় ফর্ম নেস্ট করা যেতে পারে, কিন্তু পিছনে টিক বিভিন্ন নিম্নলিখিত ফর্ম প্রয়োজন।

`echo \`foo\`` 

উল্টোদিকে:

$(echo $(foo))

1
গৌণ সংশোধন, ব্যাকটিক সংস্করণ এবং $()সংস্করণ উভয়ই পসিক্স অনুগত।
সিজেএক্সএক্স

5

কমান্ডের ভিতরে থাকা অচিহ্নবিহীন অক্ষরগুলি বাদে কিছুটা পার্থক্য নেই। এমনকি আরও জটিল দ্বি-স্তরের গভীর কমান্ডের বিকল্পের জন্য আপনি `...` কমান্ডগুলি ভিতরে ... (...) টি (এবং বিপরীতে) রাখতে পারেন।

ব্যাকস্ল্যাশ চরিত্র / অপারেটরের কিছুটা আলাদা ব্যাখ্যা রয়েছে। অন্যান্য জিনিসের মধ্যে, `...` প্রতিস্থাপনের আদেশগুলি নেস্ট করার সময় , আপনাকে অবশ্যই অভ্যন্তরীণ ` অক্ষরগুলি with সহ পালাতে হবে , যখন $ () বিকল্পের সাহায্যে এটি বাসাটি স্বয়ংক্রিয়ভাবে বুঝতে পারে।


0

"দুটি পদ্ধতির মধ্যে কোনও পার্থক্য কি?"

এই আচরণে মনোযোগ দিন:

A="A_VARIABLE"
echo "$(echo "\$A")"
echo "`echo "\$A"`"

আপনি এই ফলাফলগুলি পাবেন:

$A
A_VARIABLE

 

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