পসিক্স শেল ব্যাকরণে খোলার ব্রেসের পরে একটি ব্রেস কমান্ড গোষ্ঠীর কেন স্পেস দরকার?


10

টিএল; ডিআর : পজিক্স ব্রেস গোষ্ঠীটি কেন {সংরক্ষিত শব্দের পরে ফাঁকা স্থানের প্রয়োজন তবে সাবস্কেল সংরক্ষিত শব্দের পরে নয় (?

POSIX শেল ব্যাকরণ ব্রেস গ্রুপ এবং সাবশেল নিম্নলিখিত হিসাবে সংজ্ঞায়িত করে

brace_group      : Lbrace compound_list Rbrace

subshell         : '(' compound_list ')'

এখন, আমরা যদি আক্ষরিকভাবে এটি পড়ছি, স্পেসগুলি উল্লেখযোগ্য। এর অর্থ হ'ল স্পেস ডিলিনেটিং ওপেনিং এবং ক্লোজিং ব্রেস এবং প্রথম বন্ধনী থাকতে হবে

{ echo hello world; }

( echo hello world )

এটি যৌগিক কমান্ড সংজ্ঞাগুলির সাথেও সারিবদ্ধ হবে :

এই যৌগিক কমান্ডগুলির প্রত্যেকটির শুরুতে একটি সংরক্ষিত শব্দ বা নিয়ন্ত্রণ অপারেটর থাকে এবং শেষে টার্মিনেটর সংরক্ষিত শব্দ বা অপারেটর থাকে।

তবে যা বোঝায় না তা হ'ল কেন (list)এবং ( list )ঠিক কাজ করুন (পরে যে স্থানটির (প্রয়োজন হয় না) তবে ব্রেস সম্প্রসারণের একটি অগ্রণী স্থান থাকতে হবে, অর্থাৎ {echo hello;}কাজ করবে না।

শেল শব্দ হিসাবে অবশ্যই সংরক্ষিত শব্দের সাথে ক্ষেত্র বিভাজনের ধারণার সাথে সারিবদ্ধ হওয়ার জন্য একটি স্থানের প্রয়োজন পরে বোঝা যাবে , তবে সংজ্ঞা নিজেই ফাঁকের কোনও উল্লেখ করে না। তদ্ব্যতীত, {এবং (উভয়ই যৌগিক কমান্ডের পসিক্স সংজ্ঞা দ্বারা সংরক্ষিত শব্দ হিসাবে বিবেচনা করা হয়, তবে কেন এই সংরক্ষিত শব্দের পরে স্থানের অক্ষরের সাথে তাদের আলাদা আচরণ করা হবে? এখন, ksh (1) ম্যানুয়ালটি জানিয়েছে:

শব্দগুলি, যা অক্ষরের ক্রম, অব্যক্ত সাদা-স্থানের অক্ষর (স্পেস, ট্যাব এবং নিউলাইন) বা মেটা-অক্ষর (<,>, |,;, &, (এবং)) দ্বারা সীমিত করা হয়

অন্য কথায়, এটি বোধগম্য হয় যে ksh (শব্দের ডিলিমিটার হিসাবে স্বীকৃতি দেয় , যেখানে প্রথম শব্দটি একটি আদেশ বা পরিবর্তনশীল অ্যাসাইনমেন্ট হবে। পসিক্স, তবে (মেটা-চরিত্র হিসাবে উল্লেখ করা হবে না । পসিক্স ব্যাকরণ পর্যন্ত কেবলমাত্র সম্ভাব্য ব্যাখ্যাটিই আমি খুঁজে পেলাম এটি {একটি "টোকেন" হিসাবে বিবেচিত, যেখানে হিসাবে (এটি একটি হিসাবে তালিকাভুক্ত নয়।

/* These are reserved words, not operator tokens, and are
   recognized when reserved words are recognized. */


%token  Lbrace    Rbrace    Bang
/*      '{'       '}'       '!'   */

সুতরাং এই তাত্পর্য জন্য সঠিক যুক্তি কি হবে?

গৃহীত উত্তর নোট:

  • আইজ্যাকের উত্তরে স্বীকৃত চেকমার্ক সরানো হয়েছে যেহেতু এটি Q ইউটকে নিজেই স্ট্যান্ডার্ড সরবরাহ করে যা সরাসরি আমার প্রশ্নের সমাধান করে:

    উদাহরণস্বরূপ, '(' এবং ')' <space>হ'ল কন্ট্রোল অপারেটর, যাতে (তালিকায়) কোনও প্রয়োজন হয় না। তবে, ';' এবং '}'} list; in এর মধ্যে সংরক্ষিত শব্দ, যাতে এই ক্ষেত্রে শীর্ষস্থানীয় <space>এবং <semicolon>প্রয়োজনীয় হয়।

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

    এই যৌগিক কমান্ডগুলির প্রত্যেকটির শুরুতে একটি সংরক্ষিত শব্দ বা নিয়ন্ত্রণ অপারেটর রয়েছে

  • {শেল ব্যাকরণে তালিকাভুক্ত forবা এর অনুরূপ সংরক্ষিত শব্দ হিসাবে সংজ্ঞায়িত করা হয়েছে while(প্রশ্নের শেষ কোড ব্লকটি দেখুন)

  • বিভাগ ২.৯ বলছে (জোর দেওয়া হয়েছে):

    বিশেষত, উপস্থাপনাগুলি এমন কিছু জায়গায় টোকেনের মধ্যে ব্যবধান অন্তর্ভুক্ত করে যেখানে <blank>এসগুলি প্রয়োজন হবে না (যখন টোকেনগুলির মধ্যে একটি অপারেটর থাকে)।

  • যদিও মানটি (অপারেটর হিসাবে স্পষ্টভাবে সংজ্ঞায়িত করে না , (অপারেটর হিসাবে উল্লেখ করা হয়; বিশেষত, বিভাগ 2.9.2 বলছে

    পাইপলাইন শুরু হলে সংরক্ষিত শব্দ! এবং কমান্ড 1 একটি সাবশেল কমান্ড, অ্যাপ্লিকেশনটি নিশ্চিত করবে যে (কমান্ড 1 এর শুরুতে অপারেটর এক বা একাধিক অক্ষর দ্বারা! পৃথক! সংরক্ষিত শব্দের আচরণ! অবিলম্বে অনুসরণকারী (অপারেটর অনির্ধারিত)।

  • ডিজিটাল ট্রমা দ্বারা স্ট্যাক ওভারফ্লো সম্পর্কিত প্রশ্ন সংরক্ষিত শব্দের উপরের অংশটি ২.৪ দেখায়:

    এই স্বীকৃতিটি তখনই ঘটতে পারে যখন কোনও অক্ষরের উদ্ধৃতি না দেওয়া হয় এবং যখন শব্দটি ব্যবহৃত হয়:

    কমান্ডের প্রথম শব্দ

  • যেমনটি কুসালানন্দের জবাবে উল্লেখ করা হয়েছে "পসিক্স ব্যাকরণে প্রদর্শিত ফাঁকা স্থানগুলি শেল ইনপুট ডেটাতে থাকা দরকার নয়, ব্যাকরণটি প্রদর্শন করার কেবল একটি উপায়। তাদের সাদা অংশে ঘিরে থাকতে হবে " মাইকেল হোমার মন্তব্যগুলিতে যেমন উল্লেখ করেছেন :" স্পেসগুলি যদি তাদের নিজস্বভাবে উল্লেখযোগ্য হত তবে তাদের উত্পাদনে তালিকাভুক্ত করা দরকার "

মামলা বন্ধ.


3
স্পেসগুলি যদি তাদের নিজস্বভাবে উল্লেখযোগ্য হত তবে তাদের উত্পাদনে তালিকাবদ্ধ করা দরকার।
মাইকেল হোমার

2
"উপরন্তু, যদি {এবং (যৌগ কমান্ডের POSIX সংজ্ঞা দ্বারা উভয় বিবেচিত সংরক্ষিত শব্দ" cf. "এই প্রতিটি যৌগিক কমান্ডের শুরুতে একটি সংরক্ষিত শব্দ বা নিয়ন্ত্রণ অপারেটর রয়েছে"।
মাইকেল হোমার

2
@ সার্জি কলোডিএজনি আমি বিশ্বাস করি যে তার অর্থ এই যে স্থানটি উল্লেখযোগ্য হলে ব্যাকরণটিতে একটি স্পষ্ট স্পেস ক্যারেক্টার ( ' ') অন্তর্ভুক্ত করতে হত । পরিবর্তে, স্পেসগুলি টোকেনগুলি কী শব্দ দ্বারা বোঝানো হয়।
কুসালানন্দ

2
টোকেন শ্রেণীর স্পেসিফিকেশন সংজ্ঞাটি হ'ল ... বিশ্রী, কমপক্ষে বলতে গেলে। পুরো ব্যাকরণটি বেশ ভয়ঙ্কর এবং অনুমানগুলি ব্যাকরণের আগের গদ্য বিধিগুলিতে এবং ব্যাকরণে গদ্যের পাঠ্যগুলিতে (কখনও কখনও অন্তর্নিহিত!) সংজ্ঞায়িত জিনিসগুলিকে মিশ্রিত করে। যদি আপনি ইতিমধ্যে উত্তরটি না জানেন এবং পিছনের দিকে কাজ করেন তবে এটি বেশ বোধগম্য। লেকিকাল বিধিগুলি সমস্তই পিছনের দিকে সংজ্ঞায়িত করা হয়েছে, টোকেন কী কী রয়েছে তা বর্ণনা না করে কী নতুন টোকেন শুরু করে তার দ্বারা। এটি চারদিকে কেবলই গন্ডগোল।
মাইকেল হোমার

1
আনুষ্ঠানিক ব্যাকরণে সার্জি, একটি উত্পাদন (বা উত্পাদনের নিয়ম) বর্ণনা করে যে কীভাবে আপনি অন্য কোনও কিছু থেকে কিছু তৈরি করতে পারেন। দেখুন en.wikipedia.org/wiki/Production_%28computer_science%29 সুতরাং command : simple_command | compound_command | compound_command redirect_list | function_definition ;একটি প্রকাশনা যা বলেছে তুমি কমান্ড থাকতে পারে যেখানে, এটা সহজ কমান্ড যৌগ কমান্ড বা অন্য কোন ওয়েবপেজ সঙ্গে যৌগ কমান্ড, অথবা একটি ফাংশন সংজ্ঞা এক হতে পারে না।
মুড়ু

উত্তর:


6

শেলটি লাইনগুলি টোকনে বিভক্ত করার পথে এটি একটি সীমাবদ্ধতা।

শেলটি ইনপুট ফাইল থেকে লাইনগুলি পড়ে এবং বিভাগ 2 অনুযায়ী "শেল পরিচিতি" এগুলিকে একটি শব্দ বা অপারেটরে রূপান্তর করে :

  1. শেলটি ইনপুটটিকে টোকেনে বিভক্ত করে: শব্দ এবং অপারেটর

a একটি সংরক্ষিত শব্দ

কিছু শব্দ সংরক্ষিত শব্দ

সংরক্ষিত শব্দগুলি এমন শব্দ যা শেলের বিশেষ অর্থ রয়েছে। নিম্নলিখিত শব্দগুলি সংরক্ষিত শব্দ হিসাবে স্বীকৃত হবে:

! { } case do done elif else esac fi for if in then until while

শব্দ হিসাবে শব্দ হিসাবে স্বীকৃত হতে হবে, সীমিত করা আবশ্যক

সংরক্ষিত শব্দগুলি তখনই স্বীকৃত হয় যখন সেগুলি সীমিত করা হয় ...

বেশিরভাগ ফাঁকা (পয়েন্ট)) এবং অপারেটর দ্বারা।

  1. যদি বর্তমানের অক্ষরটি একটি অব্যক্ত <ব্ল্যাঙ্ক> হয় তবে পূর্বের অক্ষরযুক্ত কোনও টোকেনটি সীমানাযুক্ত করা হবে এবং বর্তমান অক্ষরটি বাতিল করা হবে।

(একজন অপারেটর

অপারেটররা নিজেরাই পাশে দাঁড়িয়েছেন :

অপারেটররা নিজেরাই সীমিত হয় whereas

যেখানে "অপারেটর" হয় :

3.260 অপারেটর

শেল কমান্ডের ভাষায়, কন্ট্রোল অপারেটর বা পুনঃনির্দেশ অপারেটর।

পুনঃনির্দেশ অপারেটরগুলি হলেন :

পুনর্নির্দেশ অপারেটর

শেল কমান্ড ভাষায়, একটি টোকেন যা পুনঃনির্দেশ ফাংশন সম্পাদন করে। এটি নিম্নলিখিত চিহ্নগুলির মধ্যে একটি:

<     >     >|     <<     >>     <&     >&     <<-     <>

কন্ট্রোল অপারেটররা হলেন :

3.113 কন্ট্রোল অপারেটর

শেল কমান্ড ভাষায়, একটি টোকেন যা একটি নিয়ন্ত্রণ ফাংশন সম্পাদন করে। এটি নিম্নলিখিত চিহ্নগুলির মধ্যে একটি:

&   &&   (   )   ;   ;;   newline   |   ||

উপসংহার

সুতরাং, '(' এবং ')' কন্ট্রোল অপারেটর যখন '{' '}' সংরক্ষিত শব্দ।

এবং আপনার প্রশ্নের সঠিক একই বর্ণনাটি অনুমানের মধ্যে রয়েছে :

উদাহরণস্বরূপ, '(' এবং ')' হ'ল কন্ট্রোল অপারেটর, যাতে কোনও তালিকায় কোনও <স্পেস> প্রয়োজন হয় না। তবে, ';' এবং '}' words list; in এর মধ্যে সংরক্ষিত শব্দ, যাতে এই ক্ষেত্রে শীর্ষস্থানীয় <স্পেস> এবং <সেমিকোলন> প্রয়োজন হয়।

কোনটি ঠিক ব্যাখ্যা দিয়েছে কেন একটি স্থান (অথবা অন্য কোনো বিভেদক) একটি পর প্রয়োজন বোধ করা হয় {

এটি বৈধ:

{ echo yes;}

এটি যেমন:

{(echo yes);}

এই:

{(echo yes)}

বা এমনকি এটি:

{>/dev/tty echo yes;}

ঠিক আছে, শেষ উদ্ধৃতিটি ঠিক স্পট! + + 1'ed। আমাকে এখনই প্রশ্ন এবং উত্তরগুলি পর্যালোচনা করতে হবে
সের্গেই কোলডিয়াজন্য

13

কোঁকড়া ধনুর্বন্ধনী এবং বন্ধনী মধ্যে পার্থক্য হচ্ছে ধনুর্বন্ধনী (এবং আছে !) সংরক্ষিত শব্দ, শুধু মত for, if, thenইত্যাদি যখন প্রথম বন্ধনী নিয়ন্ত্রণ অপারেটার হয়। শব্দগুলিকে সাদা স্থান দ্বারা পৃথক করা দরকার।

এর অর্থ হল ঠিক যেমন আপনার থাকতে পারে না

foriin*; do

আপনার থাকতে পারে না

{somecommand;} >file

অথবা

if !somecommand; then

পসিক্স ব্যাকরণে প্রদর্শিত শূণ্যস্থানগুলি শেল ইনপুট ডেটাতে থাকা এমন ফাঁকা স্থান নয়, তবে ব্যাকরণটি প্রদর্শনের কেবল একটি উপায়। এটি হ'ল ধনুর্বন্ধনীগুলি সংরক্ষিত শব্দগুলির দ্বারা বোঝা যায় যে তাদের চারপাশে হোয়াইটস্পেসে আবদ্ধ থাকতে হবে, যখন সাবসেলের প্যারেন্টেসিসগুলি তা করে না।


1
ভাল, এটি বেশিরভাগই এর উত্তর দেয় বলে মনে হচ্ছে এবং আমি এটি দেখতে পেয়েছি "বিশেষত, উপস্থাপনাগুলিতে টোকেনের মধ্যে কিছু জায়গার মধ্যে ফাঁকা স্থান অন্তর্ভুক্ত রয়েছে যেখানে <ব্ল্যাঙ্ক> গুলি প্রয়োজন হবে না (যখন টোকেনগুলির মধ্যে একটি অপারেটর হয়)"। কেবল একটি প্রশ্ন: মানটি (অপারেটর হিসাবে কোথায় সংজ্ঞায়িত হয়? এটি কমপক্ষে ব্যাকরণ বিভাগে নেই
সের্গেই কলডিয়াজন্য

@ মিশেলহোমর আহ, ঠিকানার মতো "কন্ট্রোল অপারেটর" ;। তার জন্য ধন্যবাদ.
কুসালানন্দ

নিয়ন্ত্রণ অপারেটরগুলি সংজ্ঞা অনুসারে ম্যান পৃষ্ঠার শীর্ষে তালিকাভুক্ত হয়। আমরা ()নিয়ন্ত্রণ অপারেটর হিসাবে দেখতে পারে |যে উভয় subhell জড়িত। এবং { }বর্তমান শেলটিতে কাজ করে এবং একটি সাব-শেল জড়িত করতে পারে না।
গ্লেন জ্যাকম্যান

@ কুসালানন্দ এটি পেয়েছিলেন, বিভাগ ২.৯.২: "পাইপলাইনটি যদি সংরক্ষিত শব্দ দিয়ে শুরু হয়! । ফাঁকা> অক্ষর সংরক্ষিত শব্দের আচরণ অবিলম্বে (অপারেটর দ্বারা অনুসরণ অনির্দিষ্ট হয় "নেই একটি সুস্পষ্ট সংজ্ঞা কিন্তু মান সেটিতে কল আছে। (অপারেটর
Sergiy Kolodyazhnyy

@glennjackman যদিও এটি সত্য যে পাইপলাইনগুলিতে সাবহেলগুলি জড়িত রয়েছে, এটি উপযুক্ত বলে মনে হচ্ছে এমন সংজ্ঞা নয়। স্ট্যান্ডার্ডটিতে আরও উল্লেখ করা হয়েছে যে কিছু বাস্তবায়নের ক্ষেত্রে বর্তমান শেল এক্সিকিউশন পরিবেশে পাইপলাইন চালানো ঠিক আছে (এবং আমি জানি এটি স্ট্যান্ডার্ডে রয়েছে, কারণ আমি গতকাল পাঠটি দেখেছি এবং এখন এটি সন্ধান করছি)। আমাকে উদ্ধৃতি আমি উপরের মন্তব্য, যেখানে অন্ততপক্ষে মান এ আছে এটি যাইহোক, আপনার পরামর্শের বিন্দু হয়নি কল এটা অপারেটর যদিও স্পষ্টভাবে সংজ্ঞায়িত এক হিসাবে এটা
Sergiy Kolodyazhnyy
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.