ব্যাকটিক (`) বোঝা


35

আমি কমান্ড চেষ্টা করছি

$ b=5; echo `$b`;
-bash: 5: command not found

তবে এটি 5 টি মুদ্রণ করে না যেমন এটি অনুমিত হয়। আমি এখানে কি মিস করছি?

কমান্ডগুলিতে `(ব্যাককোট / ব্যাকটিক) এর অর্থ কী? বলে মনে হচ্ছে যে `কমান্ডগুলির মধ্যে মূল্যায়ন করে এবং আউটপুট দিয়ে তাদের প্রতিস্থাপন করে।


8
নোট করুন যে ব্যাকটিকগুলি প্রস্তাবিত নয় কারণ আপনি নেস্টেড এক্সিকিউটেড বিকল্পগুলি করার ক্ষমতা হারাবেন। ইনসেটাদ, $ (কিছু কমমান) পছন্দ করা হয়। ইমো এটি পাঠযোগ্যতার উন্নতি করে।
টমি

6
@ টমি, না, ব্যাকটিকগুলি বাসা বেঁধে দেওয়া যেতে পারে তবে এটি একটি বেঁচে থাকা দুঃস্বপ্নে পরিণত হয়, বিশেষত ডাবল-কোটিংয়ের সময়ও।
স্টাফেন চেজেলাস

উত্তর:


52

কমান্ডের আউটপুট দ্বারা ব্যাকটিক্সের মধ্যে পাঠ্য সম্পাদন করা হয় এবং প্রতিস্থাপন করা হয় (মাইনাস ট্রেইলিং নতুন লাইনের অক্ষরগুলি, এবং সাবধান থাকুন যে আউটপুটে NUL অক্ষর থাকলে শেল আচরণগুলি আলাদা হয়)। এটিকে কমান্ড প্রতিস্থাপন বলা হয় কারণ এটি কমান্ডের আউটপুট দ্বারা প্রতিস্থাপিত হয়। সুতরাং আপনি যদি 5 টি মুদ্রণ করতে চান, আপনি ব্যাকটিক্স ব্যবহার করতে পারবেন না, আপনি কোটেশন চিহ্নগুলি ব্যবহার করতে পারেন, যেমন echo "$b"বা কেবল কোনও উদ্ধৃতি ব্যবহার এবং ব্যবহার করতে পারেন echo $b

আপনি দেখতে পাচ্ছেন যেহেতু $b5 টি রয়েছে, ব্যাকটিক্স ব্যবহার bashকরার সময় কমান্ড চালানোর চেষ্টা করা হচ্ছে 5এবং যেহেতু এই জাতীয় কোনও আদেশ নেই তাই এটি ত্রুটি বার্তায় ব্যর্থ হয়।

ব্যাকটিকস কীভাবে কাজ করে তা বোঝার জন্য এটি চালানোর চেষ্টা করুন:

$ A=`cat /etc/passwd | head -n1`
$ echo "$A"

cat /etc/passwd |head -n1/etc/passwdফাইলের প্রথম লাইন মুদ্রণ করা উচিত । তবে যেহেতু আমরা ব্যাকটিকগুলি ব্যবহার করি, এটি কনসোলে এটি মুদ্রণ করে না। পরিবর্তে এটি Aপরিবর্তনশীল সংরক্ষণ করা হয়। আপনি এটি প্রতিধ্বনি $Aকরতে পারেন । নোট করুন যে প্রথম লাইনের মুদ্রণের আরও কার্যকর উপায় কমান্ডটি ব্যবহার করছে head -n1 /etc/passwdতবে আমি উল্লেখ করতে চেয়েছিলাম যে ব্যাকটিক্সের অভ্যন্তরে প্রকাশটি সহজ হতে হবে না।

সুতরাং / etc / passwd এর প্রথম লাইনটি যদি প্রথম root:x:0:0:root:/root:/bin/bashকমান্ডটি গতিশীলভাবে bash to দ্বারা প্রতিস্থাপন করা হবে A="root:x:0:0:root:/root:/bin/bash"

মনে রাখবেন যে এই বাক্য গঠনটি বোর্ন শেলের। উদ্ধৃতি দেওয়া এবং পালানো এটিকে দ্রুত একটি দুঃস্বপ্ন হয়ে ওঠে বিশেষত যখন আপনি তাদের বাসা বাঁধতে শুরু করেন। Ksh $(...)বিকল্পটি চালু করেছে যা বর্তমানে মানক ( POSIX ) এবং সমস্ত শেল (এমনকি ইউনিক্স ভি 9 এর বোর্ন শেল) দ্বারা সমর্থিত। সুতরাং আপনার $(...)পরিবর্তে আজকাল ব্যবহার করা উচিত যদি না আপনি খুব পুরানো বোর্ন শেলগুলি পোর্টেবল করার প্রয়োজন না হন।

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


1
হাই @ ক্রিজিসটফ, এটি সহায়ক! "যেহেতু $
বিতে

you can use quotation marks, like echo "$b"=> "" কি বিশেষ কিছু করে? এটা echo $bঠিক কাজ করবে বলে মনে হচ্ছে ।
টুটসি রোলস

@ অণিতা: সাধারণ উদ্ধৃতি চিহ্নগুলিতে কিছু বিশেষ কাজ করা হয় (এটি বিশেষ চরিত্রগুলির সাথে আচরণের পদ্ধতি - বিশেষত সাদা স্থানগুলির পরিবর্তন করে) তবে এক্ষেত্রে এগুলি অনেক সমস্যা ছাড়াই ফেলে দেওয়া যেতে পারে। এটি কারণ কোনও বিশেষ অক্ষর ব্যবহৃত হয় না এবং echoকমান্ডটি যে পরিমাণ আর্গুমেন্ট পায় তার বিষয়ে চিন্তা করে না সুতরাং যদি bভিতরে কিছু স্পেস থাকে তবে এটি একাধিক আর্গুমেন্ট পাবে এবং সেগুলি মুদ্রণ করবে। অন্যান্য কমান্ডের ক্ষেত্রে এটি নাও হতে পারে (বিশেষত যখন ভেরিয়েবল সেট না করা থাকে) তাই আমি সর্বদা উদ্ধৃতি সহ ভেরিয়েবলকে ঘিরে রাখি।
ক্রিজিসটফ অ্যাডামস্কি

(POSIX)আসল মানটির একটি লিঙ্ক হলে ভাল হবে।
এরিকবওয়ার্ক 22'15

1
@ এরিকবি 85: এই নোটটি আমার দ্বারা যুক্ত করা হয়নি তবে আমি আপনার লিঙ্কটি দিয়ে এটি সম্পাদনা করেছি :)
ক্রিজিসটফ অ্যাডামস্কি

11

ব্যাকটিক আপনি যা বলেছেন ঠিক তেমন করে। আপনি একটি পূর্ণসংখ্যার একটি পরিবর্তনশীল সেট করেছেন। আপনি যখন সেই পরিবর্তনশীলটি ব্যাকটিক্সের ভিতরে রাখবেন, বাশ এটিকে কমান্ড হিসাবে কার্যকর করার চেষ্টা করবে। যেহেতু এটি কোনও আদেশ নয়, আপনি যে ত্রুটিটি দেখেছেন তা পেয়ে যান।

আপনি যা করতে চান তা কেবল:

$ b=5; echo $b

ব্যাকটিক্স আরও ভালভাবে বুঝতে, এর সাথে তুলনা করুন:

$ b=5; a=`echo $b`; echo $a
  5

8

ধাপে ধাপে আপনার লাইনটি এটি ব্যাখ্যা করা উচিত।

$ b=5; echo `$b`;
  1. পরিবর্তনশীল b5 এ সেট করে
  2. মূল্যায়ন $b(কার্যকরভাবে চালিত 5)
  3. echoএস উপরোক্ত মূল্যায়ন ফলাফল।

হ্যাঁ, আপনি যে আউটপুটটি পেয়েছেন তা প্রত্যাশিত। আপনি কোনও ভেরিয়েবলের বিষয়বস্তু মূল্যায়ন করছেন, আসল কমান্ডটি নয় যে আপনি ভেবেছিলেন not আপনি ব্যাকটিক্সের ভিতরে যা কিছু রেখেছেন তা একটি নতুন (উপ) শেলের মধ্যে সরল মূল্যায়ন (চালিত)।


হাই @gertvdijk, আপনার পোস্টের জন্য ধন্যবাদ! আমি ভাবছিলাম `এর বিষয়বস্তুগুলি মূল্যায়ন করার পরে যা বাকী রয়েছে তা ফিরিয়ে দেয়। সুতরাং, আমি ভেবেছিলাম `$ বি 'এটি প্রিন্ট করতে ইকো-এর জন্য 5 ফেরত আসবে
কুলক্রিক
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.