ইন এই প্রশ্নের কেউ একটি সমস্যা ব্যবহার রিপোর্ট এখানে ডকুমেন্ট ভিতরে উদ্ধৃত বিভেদক শব্দ দিয়ে $(...)
কমান্ড প্রতিকল্পন , যেখানে একটা ব্যাকস্ল্যাশ \
ডকুমেন্ট ট্রিগার ভিতরে একটি লাইন শেষে সম্পর্কে newline-যোগদান লাইন ধারাবাহিকতা , যখন একই এখানে নথি বাহিরে আশানুরূপ কমান্ড প্রতিকল্পন কাজ ।
এখানে সরলীকৃত উদাহরণ নথি:
cat <<'EOT'
abc ` def
ghi \
jkl
EOT
এর মধ্যে একটি লাইনের শেষে একটি ব্যাকটিক এবং একটি ব্যাকস্ল্যাশ অন্তর্ভুক্ত রয়েছে। ডিলিমিটারটি উদ্ধৃত হয়, তাই দেহের অভ্যন্তরে কোনও প্রসার ঘটে না। বোর্ন-অ্যালাইক্সে আমি খুঁজে পেতে পারি বিষয়বস্তুটি শব্দটির বাইরে out আমি যদি কমান্ড সাবস্টিটিউশনের ভিতরে একই ডকুমেন্টটি রাখি:
x=$(cat <<'EOT'
abc ` def
ghi \
jkl
EOT
)
echo "$x"
তাহলে তারা আর অভিন্ন আচরণ করবে না:
dash
,ash
,zsh
,ksh93
, Busyboxash
,mksh
এবং SunOS 5.10 POSIXsh
সব নথির ধারণকৃত বিষয়বস্তু, আগের মতই দিতে।- 3.2 বাশটি তুলনামূলক ব্যাকটিকের জন্য একটি সিনট্যাক্স ত্রুটি দেয়। ম্যাচ করা ব্যাকটিক্স সহ এটি কমান্ড হিসাবে সামগ্রীগুলি চালনার চেষ্টা করে।
- 4.3-এর বাশ একটি "লাই" এবং "জে কেএল" একটি একক লাইনে পতিত হয়েছে, তবে ত্রুটি নেই।
--posix
বিকল্প এই প্রভাব ফেলে না। কুসালানন্দ আমাকে বলেছেন (ধন্যবাদ!) যাpdksh
একইভাবে আচরণ করে ।
মূল প্রশ্নে, আমি বলেছিলাম এটি বাশের পার্সারে একটি বাগ ছিল was তাই কি? [আপডেট: হ্যাঁ ] পসিক্সের প্রাসঙ্গিক পাঠ্য (শেল কমান্ড ভাষার সংজ্ঞা থেকে সমস্ত) আমি খুঁজে পেতে পারি:
- .62.6.3 কমান্ড সাবস্টিটিউশন :
$ (কমান্ড) ফর্মের সাহায্যে মেলা বন্ধ হওয়া বন্ধনীতে ওপেন বন্ধনী অনুসরণকারী সমস্ত অক্ষর কমান্ডটি গঠন করে। কোনও বৈধ শেল স্ক্রিপ্ট কমান্ডের জন্য ব্যবহার করা যেতে পারে , কেবলমাত্র পুনর্নির্দেশের সমন্বিত স্ক্রিপ্ট ছাড়া যা অনির্দিষ্ট ফলাফল দেয় produces
- .72.7.4 এখানে-নথি :
যদি শব্দের কোনও অংশ উদ্ধৃত হয়, শব্দের উপর উদ্ধৃতি অপসারণ সম্পাদন করে ডিলিমিটারটি গঠিত হবে এবং এখানে নথির লাইনগুলি প্রসারিত হবে না।
- Escape2.2.1 এস্কেপ চরিত্র (ব্যাকস্ল্যাশ) :
যদি কোনও <নিউলাইন> <ব্যাকস্ল্যাশ> অনুসরণ করে তবে শেল এটি লাইন ধারাবাহিকতা হিসাবে ব্যাখ্যা করবে। টোকেনগুলিতে ইনপুট বিভক্ত করার আগে <ব্যাকস্ল্যাশ> এবং <নিউলাইন> সরানো হবে।
- .32.3 টোকেন স্বীকৃতি :
যখন একটি io_here টোকনটি ব্যাকরণ দ্বারা স্বীকৃত হয়েছে ( শেল ব্যাকরণ দেখুন ), পরবর্তী লাইনগুলির সাথে সাথে পরবর্তী নিউলাইন টোকেনের সাথে সাথে এক বা একাধিক এখানে-নথির দল গঠন করা হবে এবং এখানে নিয়ম অনুসারে পার্স করা হবে - ডকুমেন্ট ।
যখন এটি কোনও আইও_ এখানে প্রক্রিয়া করছে না , শেলটি তার ইনপুটটিতে পরবর্তী অক্ষরের নীচে প্রথম প্রযোজ্য নিয়ম প্রয়োগ করে টোকেনগুলিতে তার ইনপুটটি ভেঙে দেবে। ...
...
- যদি বর্তমান অক্ষরটি <ব্যাকস্ল্যাশ>, একক-উক্তি, বা ডাবল উদ্ধৃতি হয় এবং এটি উদ্ধৃত না হয় তবে এটি উদ্ধৃত পাঠ্যের শেষ পর্যন্ত পরবর্তী অক্ষরগুলির জন্য উদ্ধৃতকরণকে প্রভাবিত করবে। উদ্ধৃতি দেওয়ার নিয়মগুলি উদ্ধৃতিতে বর্ণিত হিসাবে রয়েছে । টোকেন স্বীকৃতি চলাকালীন কোনও প্রতিস্থাপন আসলে করা হবে না এবং ফলাফলের টোকেনটিতে ঠিক এমন অক্ষর থাকবে যা ইনপুটটিতে উপস্থিত হবে (<নিউলাইনল> যোগ দেওয়া ব্যতীত), মোডবিহীন, কোনও এমবেডড বা ঘেরযুক্ত কোট বা বিকল্প অপারেটরগুলি সহ এবং শেষের মধ্যে থাকবে উদ্ধৃত পাঠ্যের।
আমার এটির ব্যাখ্যাটি হ'ল $(
সমাপ্তি অবধি সমস্ত অক্ষর )
শেল স্ক্রিপ্ট, ভারব্যাটিম; এখানে একটি নথি উপস্থিত হয়, সুতরাং এখানে ডকুমেন্ট প্রসেসিং সাধারণ টোকেনাইজেশনের পরিবর্তে ঘটে; এখানে নথিতে তারপরে একটি উদ্ধৃত ডিলিমিটার রয়েছে, যার অর্থ এটির বিষয়বস্তুগুলি ভারব্যাটিম প্রসেস করা হয়; এবং পালানোর চরিত্রটি এর মধ্যে আসে না। তবে আমি একটি যুক্তি দেখতে পাচ্ছি যে এই ক্ষেত্রে কেবল সমাধান করা হয়নি, এবং উভয় আচরণই অনুমোদিত। এটাও সম্ভব যে আমি কোথাও কোনও প্রাসঙ্গিক পাঠ্যও বাদ দিয়েছি।
- এই পরিস্থিতি কি অন্য কোথাও পরিষ্কার হয়ে গেছে?
- কোন পোর্টেবল স্ক্রিপ্টটি (তত্ত্ব অনুসারে) নির্ভর করতে সক্ষম হওয়া উচিত?
- এই শাঁসের যে কোনও দ্বারা প্রদত্ত সুনির্দিষ্ট চিকিত্সা (বাশ 3.2 / বাশ 4.3 / প্রত্যেকে) মানক দ্বারা বাধ্যতামূলক? নিষিদ্ধ? অনুমোদিত হতে হবে?
echo "$x"
, তবে ভেরিয়েবলের কাজগুলি পরিদর্শন করার যে কোনও উপায়। আমি লাইনটি নীচে সম্পাদনা করেছি।
$(...)
যে আউটপুট তা হ'ল প্রতিস্থাপন করে ... এখন, আপনার উদাহরণে সাব-শেল (ইন bash
) -তে কমান্ডটি চালানোর সময় এটি প্রত্যাশিত ফলাফলকে আউটপুট দেয়। এটি কেবলমাত্র কমান্ড প্রতিস্থাপনে পরিণত করার সময় এটি "ghi" এবং "jkl" ভেঙে যায়। সুতরাং এটি একটি বাগ ইমো