বাশের মার্জিত সরলতাটি বিশাল ম্যান পৃষ্ঠাতে হারিয়ে গেছে বলে মনে হচ্ছে।
উপরের দুর্দান্ত সমাধানগুলি ছাড়াও, আমি ভেবেছিলাম যে কীভাবে বাশ পার্স এবং বিবৃতি ব্যাখ্যা করে তা সম্পর্কে আপনাকে একটি ঠক শীট দেওয়ার চেষ্টা করব । তারপরে এই রোডম্যাপটি ব্যবহার করে আমি প্রশ্নকারীর দ্বারা উপস্থাপিত উদাহরণগুলিকে পার্স করব যাতে তারা কেন উদ্দেশ্য হিসাবে কাজ করে না তা আরও ভালভাবে বুঝতে help
দ্রষ্টব্য: শেল স্ক্রিপ্ট লাইনগুলি সরাসরি ব্যবহৃত হয়। টাইপ করা ইনপুট-লাইনগুলি প্রথম ইতিহাস-প্রসারিত।
প্রতিটি বাশ লাইন প্রথমে টোকেনাইজড হয় , বা অন্য কথায় টোকেন বলা হয় যা কাটা । (ব্রেস, টিলড, প্যারামিটার, কমান্ড, পাটিগণিত, প্রক্রিয়া, শব্দ বিভাজন এবং ফাইলের নাম প্রসারণ সহ অন্যান্য সমস্ত বিস্তারের আগে টোকেনাইজিংয়ের ঘটনা ঘটে))
এখানে একটি টোকেন অর্থ ইনপুট লাইনের একটি অংশকে আলাদা করা (সীমিত) এই বিশেষ মেটা-অক্ষরগুলির মধ্যে একটি দ্বারা:
space, - White space...
tab,
newline,
‘<’, - Redirection & piping...
‘|’,
‘>’
‘&’, - And/Both < | > | >> .or. &<file descriptor>
‘;’, - Command termination
‘(’, - Subshell, closed by - ‘)’
বাশ অন্যান্য অনেকগুলি বিশেষ অক্ষর ব্যবহার করে তবে কেবল এই 10 টি প্রাথমিক টোকেন উত্পাদন করে।
তবে এই মেটা-চরিত্রগুলি মাঝে মাঝে একটি টোকেনের মধ্যেও ব্যবহার করা উচিত, তাদের বিশেষ অর্থটি সরিয়ে নেওয়ার একটি উপায় থাকা দরকার। একে বলা হয় পলায়ন। পলায়নপরকিন্তু হয়, (অর্থাত এক বা একাধিক অক্ষর একটি স্ট্রিং মূল্য উদ্ধৃতি দ্বারা পারেন সম্পন্ন 'xx..'
, "xx.."
), অথবা ব্যাক-স্ল্যাশ, (অর্থাত সঙ্গে একটি পৃথক চরিত্র prefixing দ্বারা \x
)। (এটি এর চেয়ে কিছুটা জটিল) কারণ উদ্ধৃতিগুলিও উদ্ধৃত করা দরকার, এবং কারণ ডাবল উদ্ধৃতিগুলি সমস্ত কিছু উদ্ধৃত করে না, তবে এই সরলীকরণটি আপাতত তা করবে)
অন্যান্য ভাষার মতো টেক্সটের একটি স্ট্রিং উদ্ধৃত করার ধারণার সাথে বাশের উদ্ধৃতিটিকে গুলিয়ে ফেলবেন না। বাশ-এর উদ্ধৃতিগুলির মধ্যে যা রয়েছে তা স্ট্রিং নয়, বরং ইনপুট লাইনের যে অংশগুলিতে মেটা-অক্ষর রয়েছে তা পালিয়ে গেছে যাতে তারা টোকেনগুলি সীমিত না করে।
দ্রষ্টব্য, '
এবং এর মধ্যে একটি গুরুত্বপূর্ণ পার্থক্য রয়েছে "
তবে এটি অন্য দিনের জন্য।
অবশিষ্ট অপরিবর্তিত মেটা-অক্ষরগুলি তারপরে টোকেন বিভাজক হয়ে যায়।
উদাহরণ স্বরূপ,
$ echo "x"'y'\g
xyg
$ echo "<"'|'\>
<|>
$ echo x\; echo y
x; echo y
প্রথম উদাহরণে একটি স্পেস ডিলিমিটার দ্বারা উত্পাদিত দুটি টোকেন রয়েছে: echo
এবং xyz
।
একইভাবে ২ য় উদাহরণে।
তৃতীয় উদাহরণটি সেমিকোলন পলান হয়, তাই 4 একটি স্থান বিভেদক, দ্বারা উত্পাদিত টোকেন হয় echo
, x;
, echo
, এবং y
। প্রথম টোকেনটি তখন কমান্ড হিসাবে চালিত হয় এবং পরবর্তী তিনটি টোকেন ইনপুট হিসাবে নেয়। নোট 2 ম echo
কার্যকর করা হয় না।
গুরুত্বপূর্ণ বিষয় মনে রাখা পলায়নের অক্ষরের জন্য যে ব্যাশ প্রথম দেখায় ( '
, "
, এবং \
), এবং তারপর unescaped মেটা-চরিত্র বিভেদক জন্য দেখায়, যাতে।
যদি পালানো না হয় তবে এই 10 টি বিশেষ অক্ষর token
সীমানা হিসাবে কাজ করে । তাদের মধ্যে কিছুগুলির অতিরিক্ত অর্থও রয়েছে তবে প্রথম এবং সর্বাগ্রে তারা টোকেন ডিলিমিটার।
গ্রেপ কি আশা করে
ইন, grep উপরোক্ত উদাহরণে এই টোকেন প্রয়োজন, grep
, string
, filename
।
প্রশ্নের প্রথম চেষ্টাটি ছিল:
p গ্রেপ (তারপরে | সেখানে) xx
এই ক্ষেত্রে (
, )
এবং |
unescaped মেটা অক্ষর এবং তাই এই টোকেন মধ্যে ইনপুট বিভক্ত করতে পরিবেশন করা: grep
, (
, then
, |
, there
, )
, এবং x.x
। , grep দেখতে চায় grep
, then|there
এবং x.x
।
প্রশ্নের দ্বিতীয় চেষ্টাটি ছিল:
গ্রেপ "(তারপরে | সেখানে)" এক্সএক্স
এই মধ্যে tokenizes grep
, (then|there)
, x.x
। আপনি যদি প্রতিধ্বনির জন্য গ্রিপ বদল করেন তবে আপনি এটি দেখতে পারেন:
প্রতিধ্বনি "(তারপরে | সেখানে)" xx
(তারপরে | সেখানে) xx