একটি সরলীকৃত কারণ একটি অক্ষর অস্তিত্ব হল: space।
ধনুর্বন্ধনী বিস্তৃতি স্থান (প্রক্রিয়াবিহীন) প্রসেস করে না।
একটি {...}
তালিকার প্রয়োজন (অ-উদ্ধৃত) ফাঁকা স্থান।
আরও বিশদ উত্তর হ'ল শেল কীভাবে একটি কমান্ড লাইনকে পার্স করে ।
কমান্ড লাইনটি পার্স (বোঝার) প্রথম পদক্ষেপ হ'ল এটিকে কিছু অংশে বিভক্ত করা।
এই অংশগুলি (সাধারণত শব্দ বা টোকেন নামে পরিচিত) লিঙ্কটি থেকে প্রতিটি মেটা-চরিত্রের একটি কমান্ড লাইন ভাগ করে ফলাফল :
- কমান্ডটি টোকেনগুলিতে বিভক্ত করে যা মেটা-অক্ষরগুলির নির্দিষ্ট সেট দ্বারা পৃথক করা হয়: স্পেস, ট্যাব, নিউলাইন,;, (,), <,>, |, এবং &। টোকেনের প্রকারের মধ্যে শব্দ, কীওয়ার্ড, আই / ও রিডাইরেক্টর এবং সেমিকোলন রয়েছে।
মেটা-অক্ষর: spacetabenter;,<>|এবং &।
বিভক্ত হওয়ার পরে শব্দগুলি একটি ধরণের হতে পারে (শেল দ্বারা বোঝা যায়):
- কমান্ড প্রাক অ্যাসিমেটমেন্টস:
LC=ALL ...
- হুকুম
LC=ALL echo
- যুক্তি
LC=ALL echo "hello"
- ফেরৎ
LC=ALL echo "hello" >&2
বন্ধনী সম্প্রসারণ
কেবলমাত্র যদি "ব্রেস স্ট্রিং" (স্পেস বা মেটা-অক্ষর ব্যতীত) কোনও একক শব্দ হয় (উপরে বর্ণিত হিসাবে) এবং উদ্ধৃত না করা হয় তবে এটি "ব্রেস প্রসারণ" এর প্রার্থী। অভ্যন্তরীণ কাঠামো পরে আরও চেক করা হয়।
সুতরাং, এটি: হয় হিসাবে বা (বাশ, zsh পৃথক পৃথক) {ls,-l}
হয়ে "ব্রেস সম্প্রসারণ" ls -l
হিসাবে যোগ্যতা অর্জন করে।first word
argument
$ {ls,-l} ### executes `ls -l`
$ echo {ls,-l} ### prints `ls -l`
কিন্তু এই এগুলি করবেন না: {ls ,-l}
। বাশ বিভক্ত হবে spaceএবং দুটি শব্দ হিসাবে লাইনটি পার্স করবে: {ls
এবং ,-l}
যা একটি ট্রিগার করবে command not found
(যুক্তিটি ,-l}
হারিয়ে গেছে):
$ {ls ,-l}
bash: {ls: command not found
আপনার লাইন: দুটি মেটা-চরিত্র এবং {ls;echo hi}
এর কারণে "ব্রেস এক্সপেনশন" হয়ে উঠবে না ।;space
এটা এই তিনটি অংশ ভেঙে হবে: {ls
নতুন কমান্ড প্রয়োগ করুন: echo
hi}
। বুঝতে পারেন যে ;একটি নতুন কমান্ড শুরু হওয়ার সূত্রপাত করে। কমান্ডটি {ls
পাওয়া যাবে না এবং পরবর্তী কমান্ডটি মুদ্রণ করবে hi}
:
$ {ls;echo hi}
bash: {ls: command not found
hi}
যদি এটি অন্য কোনও কমান্ডের পরে স্থাপন করা হয় তবে এটি এর পরেও একটি নতুন কমান্ড শুরু করবে ;:
$ echo {ls;echo hi}
{ls
hi}
তালিকা
"যৌগ কমান্ড" এক (আমার শব্দ) একটি "বন্ধনী তালিকা" is: { list; }
।
আপনি দেখতে পাচ্ছেন, এটি স্পেস এবং একটি ক্লোজিংয়ের সাথে সংজ্ঞায়িত ;
।
স্পেস এবং ;প্রয়োজনীয় কারণ উভয় {
এবং }
"সংরক্ষিত শব্দ "।
এবং তাই, শব্দ হিসাবে স্বীকৃতি পেতে, অবশ্যই মেটা-অক্ষর দ্বারা বেষ্টিত হওয়া উচিত (প্রায় সর্বদা space:)।
সংযুক্ত পৃষ্ঠার 2 পয়েন্টে বর্ণিত হিসাবে
- প্রতিটি কমান্ডের প্রথম টোকেন পরীক্ষা করে দেখুন এটি ...., {, বা (, তবে কমান্ডটি আসলে একটি যৌগিক কমান্ড)।
আপনার উদাহরণ: {ls;echo hi}
একটি তালিকা নয়।
এটির পরে একটি ক্লোজিং ;এবং একটি স্থান প্রয়োজন (কমপক্ষে) {। শেষটি }ক্লোজিং দ্বারা সংজ্ঞায়িত করা হয় ;।
এটি একটি তালিকা { ls;echo hi; }
। এবং { ls;echo hi;}
এটিও (কম ব্যবহৃত হয় তবে বৈধ) (সহায়তার জন্য @ চোরোবা ধন্যবাদ)।
$ { ls;echo hi; }
A-list-of-files
hi
কিন্তু একটি কমান্ডের পক্ষে আর্গুমেন্ট হিসাবে (শেল পার্থক্যটি জানে), এটি একটি ত্রুটি ঘটায়:
$ echo { ls;echo hi; }
bash: syntax error near unexpected token `}'
তবে শেলটি যেটি পার্স করছে তা আপনি কীভাবে সতর্ক হন:
$ echo { ls;echo hi;
{ ls
hi
{
কমান্ডের তালিকা হিসাবে ব্যাখ্যা করা হতে পারে যদি এটি কোনও কমান্ডের শুরুতে প্রদর্শিত হয় এবং অন্যথায় ব্রেস প্রসারণ হিসাবে উপস্থিত হয় তবে আমি নিশ্চিত নই।