Stuff (স্টাফ) এবং `স্টাফের মধ্যে পার্থক্য কী?


265

কমান্ড প্রতিস্থাপনের জন্য দুটি বাক্য গঠন রয়েছে: ডলার-প্রথম বন্ধনী এবং ব্যাকটিক্স সহ। চলমান top -p $(pidof init)এবং top -p `pidof init`একই আউটপুট দেয়। একই জিনিসটি করার এই দুটি উপায়, বা কোনও পার্থক্য রয়েছে?



42
সেখানে এক সেকেন্ডের জন্য আমি ভাবলাম এটি একটি jQuery প্রশ্ন।
ডেভিড মারডোক

ফলাফলটি শেলের উপর নির্ভর করে - কিছু উভয়কে সমর্থন করে।
আর্টডানিল

উত্তর:


359

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

echo $(uname | $(echo cat))
Linux

echo `uname | `echo cat``
bash: command substitution: line 2: syntax error: unexpected end of file
echo cat

নেস্টেড ব্যাককোটগুলি এড়িয়ে গেলে কাজ করে:

echo `uname | \`echo cat\``
Linux

ব্যাকস্ল্যাশ মজা:

echo $(echo '\\')
\\

echo `echo '\\'`
\

নতুন স্টাইলের $()সব ক্ষেত্রে প্রযোজ্য POSIX -conformant শাঁস। মাউভিচিয়াল
যেমন উল্লেখ করেছেন, পুরানো শেলগুলি পুরানো শাঁসের জন্য প্রয়োজনীয় হতে পারে।` `

প্রযুক্তিগত দৃষ্টিকোণ বাদে, পুরানো-শৈলীর ` `একটি দর্শনীয় অসুবিধাও রয়েছে:

  • লক্ষ্য করা শক্ত: I like $(program) better than `program`
  • একটি একক উদ্ধৃতি দিয়ে সহজেই বিভ্রান্ত: '`'`''`''`'`''`'
  • টাইপ করা এত সহজ নয় (সম্ভবত কীবোর্ডের মানক বিন্যাসেও নয়)

(এবং এসই ` `নিজের উদ্দেশ্যে ব্যবহার করে , এটি উত্তর লিখতে ব্যথা হয়েছিল :)


10
কেবলমাত্র আমি যুক্ত করব, আমি হ'ল '('
পেরেন

@ কেন্ডাল: এবং এখানে আমি ভাবলাম যে সমস্ত বছর '{' বাম বন্ধনী ছিল ...
স্যামবি

5
@Sam: { }সাধারণত "কোঁকড়া বন্ধনী" বা "ধনুর্বন্ধনী" বলা হয় en.wikipedia.org/wiki/Braces_(punctuation)#Braces
উয়র্ন Schou-Rode

2
আমি '{' কে কোঁকড়া ধনুর্বন্ধনী হিসাবেও উল্লেখ করি। যদিও এটি অদ্ভুত বলে মনে হচ্ছে আপনি যদি অন্যান্য জিনিসকে বন্ধনী হিসাবে কল করেন তবে আপনাকে কোয়ালিফায়ার "কোঁকড়ানো" যুক্ত করা দরকার ... আমি মনে করি এটি কেবল কার্ল হয়ে যাওয়ার কারণে।
কেন্ডাল হেলস্টেটার জেলনার

1
@ স্লিম আমি মার্কিন / যুক্তরাজ্যের কীবোর্ডগুলিতে জানি না, তবে স্প্যানিশ কীবোর্ডগুলিতে `একটি মৃত চাবি, সুতরাং আমাকে ডাবল-ব্যাকটিক (এমন কিছু যা আমি সাধারণত ভুলে যাই আমিও করতে পারি) টাইপ করতে হবে বা ব্যাকটিকের পরে স্থানটি যা একটি ব্যাথা।
দারখোগ

41

স্পষ্ট পার্থক্য আমি লক্ষ্য করি যে আপনি বাসা বাঁধতে পারার সময় আপনি ব্যাকটিকগুলি বাসাতে পারবেন না $()। লিগ্যাসির কারণে উভয়ই থাকতে পারে। একইভাবে, .এবং sourceআদেশগুলি সমার্থক শব্দ।


10
কিছু বোর্ন-উত্পন্ন শেল চিনতে পারে না source। ড্যাশ একটি উদাহরণ।
ডেনিস উইলিয়ামসন

14
এটা সত্যি না. আপনি যেকোন পর্যায়ে ব্যাকটিক করতে পারেন, আরও বেদনাদায়ক। নোট করুন $(...)এবং উভয়ই `...`মানক (পরে অবনতিযোগ্য) .মানসম্পন্ন হলেও মানসম্মত নয়source
স্টাফেন চেজেলাস

3
সংশোধন, কেবলমাত্র (t)cshতারা বাসা বাঁধতে পারে না। যদিও (t)cshসমর্থন করবেন না $(...)। তারা সমর্থন source(এবং না .) যদিও।
স্টাফেন চেজেলাস

28

$()পুরানো বোর্ন শেল দিয়ে কাজ করে না। কিন্তু এটা হয়েছে বছর কয়েক দশক ধরে যেহেতু আমি পুরাতন বোর্ন শেল সঙ্গে কাজ করেন।


1970 এর দশকের এবং 1980 এর দশকের প্রথম দিকের মতো পুরানো, তাই না?
ক্রিস্টোফার

6

আরেকটি নোট, $()ব্যাকটিকগুলি ব্যবহারের চেয়ে আরও বেশি সিস্টেম সংস্থান ব্যবহার করবে তবে এটি কিছুটা দ্রুত।

ইন নিয়ন্ত্রণ ইউনিক্স শেল স্ক্রিপ্টিং , Randal কে মাইকেল "24 উপায় একটি ফাইল লাইন-দ্য-লাইন দ্বারা প্রক্রিয়া" নামের একটি অধ্যায়ে একটি পরীক্ষা সম্পন্ন করেছে।


2
এই দাবিটি বাজে কথা। এটি পার্সারের জন্য কেবল আলাদা স্বরলিপি ব্যবহার করার কারণে এটি দ্রুত হওয়ার কারণ নেই।
সহজেই 6'15

@ শাইলি: সম্ভবত, আমি কেবল বইটি থেকে উদ্ধৃত করেছি, আপনি আরও বিশদে এটি পড়তে পারেন।
cuonglm

3
আমি @ প্রশংসার সাথে একমত হতে চাই ... কেন এটি আরও সংস্থান গ্রহণ করবে?
ওয়াইল্ডকার্ড

2
@ উইলকার্ড, আমি মনে করি এটি $()আপনার স্ক্রিপ্টটি ব্যবহারের চেয়ে এক বাইটকে আরও বড় করে তোলে `(ধরে নিই যে আপনি এগুলিকে বাসা বাঁধেন না এবং এর মধ্যে ব্যাকস্ল্যাশ ব্যবহার করবেন না)। কোনটি পার্স করা দ্রুত হবে, এটি শাঁসের মধ্যে পৃথক হবে এবং পাইপ তৈরির ব্যয় এবং কমান্ড প্রতিস্থাপনে প্রক্রিয়াকরণের প্রক্রিয়া তৈরির ব্যয়ের তুলনায় অপ্রস্তুত হবে।
স্টাফেন চেজেলাস

5

অন্যরা এখানে যা বলেছে তা যুক্ত করতে, আপনি ইনলাইন মন্তব্যগুলি অনুকরণ করতে ব্যাকটিক্স ব্যবহার করতে পারেন:

echo foo `# I'm a comment!` bar

আউটপুট হল: foo bar

আরও তথ্যের জন্য নিম্নলিখিতটি দেখুন: https://stackoverflow.com/a/12797512 (সেই পোস্টের নীচে দেওয়া মন্তব্যগুলিও নোট করুন))


1

$()সিনট্যাক্স পুরাতন বোর্ন শেল সঙ্গে কাজ করবে না।
আরও নতুন শেল সহ ` `এবং $()সমতুল্য তবে $()যখন আপনাকে একাধিক কমান্ড বাসা বাঁধতে হবে তখন এটি ব্যবহার করা আরও বেশি সুবিধাজনক।

এই ক্ষেত্রে :

echo $(basename $(dirname $(dirname /var/adm/sw/save )))

এর চেয়ে টাইপ করা এবং ডিবাগ করা সহজ:

echo `basename \`dirname \\\`dirname /var/adm/sw/save \\\`\``

1
যদিও $ () দেখতে দেখতে সুন্দর লাগছে, সম্পর্কিত পার্সার প্রয়োগ করার সময় এটি ব্যথা হয় কারণ এর জন্য দ্বৈত পুনরাবৃত্ত পার্সার প্রয়োজন।
সহজেই

6
@ শচিলি অন্যদিকে, ভাল পার্সার ছাড়াই শেল কী হবে।
ইমানুয়েল

1
সমস্যাটি হ'ল পার্সারকে কল করার আগে আপনার স্ট্রিংটি কোথায় শেষ হবে তা জানতে হবে। এটি ব্যাকটিক্সগুলির সাথে তুলনামূলকভাবে সহজ তবে এটি বন্ধনীগুলির সাথে শক্ত কারণ সেগুলি শেলের বিভিন্ন উদ্দেশ্যে ব্যবহৃত হয়। সুতরাং আপনার দুবার পার্সার প্রয়োজন এবং এমনভাবে যা বোর্ন শেলটিতে নেই।
সুদৃ .়ভাবে
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.