কমান্ড প্রতিস্থাপনের জন্য দুটি বাক্য গঠন রয়েছে: ডলার-প্রথম বন্ধনী এবং ব্যাকটিক্স সহ। চলমান top -p $(pidof init)
এবং top -p `pidof init`
একই আউটপুট দেয়। একই জিনিসটি করার এই দুটি উপায়, বা কোনও পার্থক্য রয়েছে?
কমান্ড প্রতিস্থাপনের জন্য দুটি বাক্য গঠন রয়েছে: ডলার-প্রথম বন্ধনী এবং ব্যাকটিক্স সহ। চলমান top -p $(pidof init)
এবং top -p `pidof init`
একই আউটপুট দেয়। একই জিনিসটি করার এই দুটি উপায়, বা কোনও পার্থক্য রয়েছে?
উত্তর:
পুরানো স্টাইলের ব্যাককোয়টিগুলি ` `
ব্যাকস্ল্যাশগুলি এবং কিছুটা আলাদা বাসা বাঁধে । নতুন স্টাইলটি কমান্ড হিসাবে $()
মধ্যবর্তী স্থানে সমস্ত কিছু ব্যাখ্যা করে ( )
।
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`
'`'`''`''`'`''`'
(এবং এসই ` `
নিজের উদ্দেশ্যে ব্যবহার করে , এটি উত্তর লিখতে ব্যথা হয়েছিল :)
{ }
সাধারণত "কোঁকড়া বন্ধনী" বা "ধনুর্বন্ধনী" বলা হয় en.wikipedia.org/wiki/Braces_(punctuation)#Braces
`
একটি মৃত চাবি, সুতরাং আমাকে ডাবল-ব্যাকটিক (এমন কিছু যা আমি সাধারণত ভুলে যাই আমিও করতে পারি) টাইপ করতে হবে বা ব্যাকটিকের পরে স্থানটি যা একটি ব্যাথা।
স্পষ্ট পার্থক্য আমি লক্ষ্য করি যে আপনি বাসা বাঁধতে পারার সময় আপনি ব্যাকটিকগুলি বাসাতে পারবেন না $()
। লিগ্যাসির কারণে উভয়ই থাকতে পারে। একইভাবে, .
এবং source
আদেশগুলি সমার্থক শব্দ।
source
। ড্যাশ একটি উদাহরণ।
$(...)
এবং উভয়ই `...`
মানক (পরে অবনতিযোগ্য) .
মানসম্পন্ন হলেও মানসম্মত নয়source
(t)csh
তারা বাসা বাঁধতে পারে না। যদিও (t)csh
সমর্থন করবেন না $(...)
। তারা সমর্থন source
(এবং না .
) যদিও।
$()
পুরানো বোর্ন শেল দিয়ে কাজ করে না। কিন্তু এটা হয়েছে বছর কয়েক দশক ধরে যেহেতু আমি পুরাতন বোর্ন শেল সঙ্গে কাজ করেন।
আরেকটি নোট, $()
ব্যাকটিকগুলি ব্যবহারের চেয়ে আরও বেশি সিস্টেম সংস্থান ব্যবহার করবে তবে এটি কিছুটা দ্রুত।
ইন নিয়ন্ত্রণ ইউনিক্স শেল স্ক্রিপ্টিং , Randal কে মাইকেল "24 উপায় একটি ফাইল লাইন-দ্য-লাইন দ্বারা প্রক্রিয়া" নামের একটি অধ্যায়ে একটি পরীক্ষা সম্পন্ন করেছে।
$()
আপনার স্ক্রিপ্টটি ব্যবহারের চেয়ে এক বাইটকে আরও বড় করে তোলে `
(ধরে নিই যে আপনি এগুলিকে বাসা বাঁধেন না এবং এর মধ্যে ব্যাকস্ল্যাশ ব্যবহার করবেন না)। কোনটি পার্স করা দ্রুত হবে, এটি শাঁসের মধ্যে পৃথক হবে এবং পাইপ তৈরির ব্যয় এবং কমান্ড প্রতিস্থাপনে প্রক্রিয়াকরণের প্রক্রিয়া তৈরির ব্যয়ের তুলনায় অপ্রস্তুত হবে।
অন্যরা এখানে যা বলেছে তা যুক্ত করতে, আপনি ইনলাইন মন্তব্যগুলি অনুকরণ করতে ব্যাকটিক্স ব্যবহার করতে পারেন:
echo foo `# I'm a comment!` bar
আউটপুট হল: foo bar
।
আরও তথ্যের জন্য নিম্নলিখিতটি দেখুন: https://stackoverflow.com/a/12797512 (সেই পোস্টের নীচে দেওয়া মন্তব্যগুলিও নোট করুন))
$()
সিনট্যাক্স পুরাতন বোর্ন শেল সঙ্গে কাজ করবে না।
আরও নতুন শেল সহ ` `
এবং $()
সমতুল্য তবে $()
যখন আপনাকে একাধিক কমান্ড বাসা বাঁধতে হবে তখন এটি ব্যবহার করা আরও বেশি সুবিধাজনক।
এই ক্ষেত্রে :
echo $(basename $(dirname $(dirname /var/adm/sw/save )))
এর চেয়ে টাইপ করা এবং ডিবাগ করা সহজ:
echo `basename \`dirname \\\`dirname /var/adm/sw/save \\\`\``