পসিক্স শেল: এটি যদি একটি শব্দের মধ্যে শেষ চরিত্র হয় তবে `$ its তার বিশেষ অর্থটি হারাবে?


17

ছাই, ড্যাশ এবং বাশ এ, যখন আমি দৌড়ান

$ echo ab$

এটি ফিরে আসে

ab$

এই আচরণটি কি পসিক্স দ্বারা নির্দিষ্ট করা হয়েছে বা এটি পসিক্স-কমপ্লায়েন্ট শেলগুলিতে কেবল একটি সাধারণ সম্মেলন? আমি পসিক্স শেল কমান্ড ভাষা পৃষ্ঠায় এমন কিছু খুঁজে পাইনি যা এই আচরণের উল্লেখ করে।


4
আরও ভাল প্রশ্ন " এটি যদি কোনও শব্দের শেষ চরিত্র হয় তবে একটি বিশেষ অর্থ $ অর্জন করতে পারে?" কোন একক বিশেষ অর্থ অর্পিত হয় $; এটি পরামিতি সম্প্রসারণ ${...}, কমান্ড প্রতিস্থাপন $(...)এবং পাটিগণিতের এক্সপ্রেশনগুলির মতো একাধিক, তবে স্বতন্ত্র, প্রসারকে উপস্থাপন করতে ব্যবহৃত হয় $((...))। কিছু শেল অতিরিক্ত প্রসঙ্গে যেমন ksh'কমান্ড-সাবস্টিটিউশন বৈকল্পিক x=${ echo foo; echo bar;}(যা $(...)একটি সাবশেলে কমান্ডগুলি প্রয়োগ না করে মান থেকে পৃথক হয়) প্রবর্তন করে ।
চ্যানার

@ চেপনার আপনি কি ইস্যাক এবং মাইকেল হোমার এর মতের পার্থক্যের বিষয়ে বিবেচনা করবেন? তাদের উত্তরগুলি স্পষ্টভাবে একে অপরের বিরোধিতা করে
হ্যারল্ড ফিশার

1
আমি মাইকেল হোমার এর ব্যাখ্যার সাথে একমত; শেলটি পার্সিং সম্পূর্ণ না হওয়া অবধি বিস্তৃতি নিয়ে চিন্তা করতে শুরু করে না, সুতরাং একক কথায় ab$, কোনও অক্ষর অনুসরণ করা যায় না $, এটি মূল ইনপুট স্ট্রিংয়ের নাল অক্ষর দ্বারা অনুসরণ করা হয়েছিল বা কোনও ক্ষেত্রে একটি স্পেস ছিল কিনা মত echo ab$ foo; আসল আনকোটেড হোয়াইটস্পেসটি পার্স করার পরে স্বীকৃত এবং বাতিল করা হয়েছে।
চিপনার

উত্তর:


10

$নিজেই (চেষ্টা দ্বারা একটি বিশেষ অর্থে ব্যবহৃত হয় না echo $শুধুমাত্র যখন অন্যান্য চরিত্র সঙ্গে মিলিত এটি এবং সম্প্রসারণ, যেমন বিরচন পর,) $var(অথবা ${var}), $(util), $((1+2))

$তার "বিশেষ" পায় ধারার অধীন POSIX মান একটি সম্প্রসারণ সংজ্ঞা হিসাবে অর্থ টোকেন স্বীকৃতি :

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

সুতরাং, যদি $কোনও প্রসারণ গঠন না করে, অন্যান্য বিশ্বে বিধি বিধান কার্যকর হয়:

পূর্ববর্তী অক্ষরটি যদি কোনও শব্দের অংশ ছিল তবে বর্তমান অক্ষরটি সেই শব্দের সাথে সংযুক্ত করা হবে।

এটি আপনার ab$স্ট্রিং জুড়ে ।

একাকীকরণের ক্ষেত্রে $("নতুন শব্দটি" $নিজেই হয়ে যাবে):

বর্তমান চরিত্রটি একটি নতুন শব্দের শুরু হিসাবে ব্যবহৃত হয়।

অর্থ উত্পন্ন শব্দ একটি ধারণকারী $যে একটি প্রমিত সম্প্রসারণ স্পষ্টভাবে POSIX দ্বারা অনির্দিষ্ট হিসাবে সংজ্ঞায়িত করা হয় করা হয়।

এছাড়াও লক্ষ করুন যে $এটিই শেষ চরিত্র $$, তবে এটিও চলকের ক্ষেত্রে ঘটে যা বর্তমান শেলের পিআইডি ধারণ করে। ইন bash, !$ইতিহাসের প্রসারণের ডাক দিতে পারে (পূর্ববর্তী কমান্ডের শেষ যুক্তি)। সুতরাং সাধারণভাবে, না, $অব্যক্ত শব্দের শেষে অর্থহীন নয়, তবে কোনও শব্দের শেষে এটি অন্তত একটি প্রমিত প্রসারকে বোঝায় না।


7

সঠিক পরিস্থিতির উপর নির্ভর করে, এটি হয় স্পষ্টভাবে অনির্দিষ্ট (তাই বাস্তবায়নগুলি তারা যেমনটি পারে তেমন করতে পারে) বা আপনার পর্যবেক্ষণ অনুসারে ঘটতে হবে। আপনার সঠিক দৃশ্যেecho ab$ , পসিক্স আউটপুট "আব $" নির্দেশ করে যা আপনি দেখেছেন এবং এটি অনির্দিষ্ট নয় । সমস্ত বিভিন্ন ক্ষেত্রে একটি দ্রুত সংক্ষিপ্ত বিবরণ শেষে।

দুটি উপাদান রয়েছে: প্রথমে শব্দগুলিতে টোকেনাইজিং এবং তারপরে এই শব্দের ব্যাখ্যা।


Tokenisation

পসিক্স টোকেনাইজেশনটির প্রয়োজন যে এটি $যে কোনও বৈধ পরামিতি প্রসার , কমান্ড প্রতিস্থাপন বা পাটিগণিত প্রতিস্থাপনের শুরু নয় , এটি WORDটোকেনের আক্ষরিক অংশ হিসাবে বিবেচিত হবে । কারণ 5 নিয়ম ("যদি বর্তমানের চরিত্রটি যদি কোন অনুচ্চারিত হয় $বা `শেলটি শুরুর সাথে পরিচয়পত্রের বিস্তৃতি, কমান্ড প্রতিস্থাপন, বা গাণিতিক সম্প্রসারণের জন্য প্রার্থীদের প্রারম্ভিক অব্যক্ত চরিত্রের অনুক্রমগুলি থেকে শুরু করে: $বা ${, $(বা `, এবং $((যথাক্রমে" ) প্রযোজ্য নয়, কারণ এই বিস্তারের কোনওটিই সেখানে কার্যকর নয়। প্যারামিটার বিস্তারের জন্য সেখানে উপস্থিত হওয়ার জন্য একটি বৈধ নাম প্রয়োজন, এবং একটি খালি নাম বৈধ নয়।

যেহেতু এই বিধি প্রযোজ্য হয়নি, আমরা যতক্ষণ না এটির সন্ধান না করে আমরা তা অনুসরণ করে চলি। দুটি প্রার্থী হলেন # 8 ("যদি পূর্বের চরিত্রটি একটি শব্দের অংশ ছিল তবে বর্তমান চরিত্রটি সেই শব্দের সাথে সংযুক্ত করা হবে।") এবং # 10 ("বর্তমান অক্ষরটি একটি নতুন শব্দের শুরু হিসাবে ব্যবহৃত হয়েছে।") , এর প্রয়োগ যা echo a$এবং echo $যথাক্রমে।

ফর্মের একটি তৃতীয় echo a$+bকেসও রয়েছে যা একই ক্র্যাকের মধ্য দিয়ে পড়ে, যেহেতু +কোনও বিশেষ প্যারামিটারের নাম নয়। এটি একটি আমরা পরে ফিরে আসব, যেহেতু এটি নিয়মের বিভিন্ন অংশকে ট্রিগার করে।

স্পেসিফিকেশনের জন্য $শর্তটি সিনথেটিকভাবে শব্দের একটি অংশ হিসাবে বিবেচনা করা প্রয়োজন এবং এটি পরে আরও প্রক্রিয়া করা যেতে পারে।


শব্দ প্রসার

$শব্দটি অন্তর্ভুক্ত করে ইনপুটটি এভাবে পার্স হওয়ার পরে , শব্দের বিস্তৃতি প্রতিটি শব্দের সাথে প্রয়োগ করা হয়েছে। প্রতিটি শব্দ পৃথকভাবে প্রক্রিয়া করা হয় ।

এটি নির্দিষ্ট করা হয় :

যদি অব্যক্ত '$' এর পরে এমন কোনও চরিত্র অনুসরণ করা হয় যা নিম্নলিখিতগুলির মধ্যে একটি নয়:

  • একটি সাংখ্যিক চরিত্র
  • বিশেষ প্যারামিটারগুলির একটির নাম ( বিশেষ প্যারামিটারগুলি দেখুন )
  • একটি চলক নামের একটি বৈধ প্রথম অক্ষর
  • <left-curly-bracket>('{')
  • একজন <left-parenthesis>

ফলাফল অনির্ধারিত হয়।

"অনির্দিষ্ট" এখানে একটি নির্দিষ্ট শব্দ যার অর্থ

  1. একটি উপযুক্ত শেল এই ক্ষেত্রে যে কোনও আচরণ চয়ন করতে পারে
  2. মেনে চলার অ্যাপ্লিকেশন কোনও নির্দিষ্ট আচরণের উপর নির্ভর করতে পারে না

আপনার উদাহরণে, echo ab$এটি কোনও চরিত্র $ দ্বারা অনুসরণ করা হয় না , সুতরাং এই নিয়মটি প্রয়োগ হয় না এবং অনির্ধারিত ফলাফলটি চাওয়া হয় না। এর দ্বারা প্ররোচিত কোনও প্র विस्तार নেই $, সুতরাং এটি আক্ষরিকভাবে উপস্থিত এবং মুদ্রিত out

কোথায় যাবে আবেদন উপরে থেকে আমাদের তৃতীয় ক্ষেত্রে রয়েছে: echo a$+b। এখানে $দ্বারা অনুসরণ করা হয় +, যা একটি সংখ্যা, বিশেষ প্যারামিটার নয় ( @, *, #, ?, -, $, !, অথবা 0), একটি ভেরিয়েবলের শুরু নাম (আন্ডারস্কোর বা থেকে একটি বর্ণানুক্রমিক পোর্টেবল অক্ষর সেট ), অথবা বন্ধনী করুন। এই ক্ষেত্রে, আচরণ অনির্দিষ্ট: একটি অনুসারী শেল একটি বিশেষ পরামিতি নামক উদ্ভাবন অনুমতি দেওয়া হয় +প্রসারিত করতে , এবং একটি মানানসই আবেদন অনুমান করা উচিত নয় যে শেল না । শেলটি ত্রুটি প্রতিবেদন করা সহ এটির মতো পছন্দ করে অন্য কিছু করতে পারে।

উদাহরণস্বরূপ, zsh, তার পসিক্স মোড সহ, "ভেরিয়েবল সেট" হিসাবে ব্যাখ্যা করে$+bb এবং এর জায়গায় 1 বা 0 এর বিকল্প দেয়। এটা তোলে একভাবে জন্য এক্সটেনশন রয়েছে ~এবং =। এটি মানানসই আচরণ।

এটি ঘটতে পারে এমন অন্য একটি জায়গা echo "a$ b"। আবার, শেলটি যেমনটি ইচ্ছা তেমন করার অনুমতি দেয় এবং আপনি $যদি আক্ষরিক আউটপুট চান তবে স্ক্রিপ্ট লেখক হিসাবে আপনাকে এড়ানো উচিত । আপনি যদি এটি না করেন তবে এটি কাজ করতে পারে তবে আপনি এটির উপর নির্ভর করতে পারবেন না। এটি স্পেসিফিকেশনের পরম অক্ষর, তবে আমি মনে করি না যে এই ধরণের গ্রানুলারিটিটি উদ্দেশ্যযুক্ত বা বিবেচিত হয়েছিল।


সংক্ষেপে

  • echo ab$: আক্ষরিক আউটপুট, সম্পূর্ণ নির্দিষ্ট
  • echo a$ b: আক্ষরিক আউটপুট, সম্পূর্ণ নির্দিষ্ট
  • echo a$ b$: আক্ষরিক আউটপুট, সম্পূর্ণ নির্দিষ্ট
  • echo a$b: bসম্পূর্ণ পরামিতি পরামিতি প্রসারিত
  • echo a$-b: -সম্পূর্ণ নির্দিষ্টভাবে নির্দিষ্ট পরামিতিগুলির প্রসারণ
  • echo a$+b: অনির্দিষ্ট আচরণ
  • echo "a$ b": অনির্দিষ্ট আচরণ

একটি জন্য $একটি শব্দ শেষে, আপনি আচরণের উপর নির্ভর করার অনুমতি দেওয়া এবং এটা আক্ষরিক চিকিত্সা এবং কাছে হস্তান্তর করা উচিত নয় echoতার যুক্তি অংশ হিসেবে কমান্ড। এটি শেলের উপর একটি কনফারেন্সের প্রয়োজনীয়তা।


মন্তব্যগুলি বর্ধিত আলোচনার জন্য নয়; এই কথোপকথন চ্যাটে সরানো হয়েছে ।
টেরডন

@ মিশেলহোমারও কি echo $আক্ষরিক এবং সম্পূর্ণরূপে নির্দিষ্ট করা হবে?
হ্যারল্ড ফিশার

@ হারল্ডফিশার হ্যাঁ
মাইকেল

কোথায় echo "$"এবং echo "a b$"পতনের?
হ্যারল্ড ফিশার
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.