কমান্ড সাবস্টিটিউশনের ভিতরে উদ্ধৃত নথির জন্য পসিক্সের কী প্রয়োজন?


20

ইন এই প্রশ্নের কেউ একটি সমস্যা ব্যবহার রিপোর্ট এখানে ডকুমেন্ট ভিতরে উদ্ধৃত বিভেদক শব্দ দিয়ে $(...)কমান্ড প্রতিকল্পন , যেখানে একটা ব্যাকস্ল্যাশ \ডকুমেন্ট ট্রিগার ভিতরে একটি লাইন শেষে সম্পর্কে newline-যোগদান লাইন ধারাবাহিকতা , যখন একই এখানে নথি বাহিরে আশানুরূপ কমান্ড প্রতিকল্পন কাজ ।

এখানে সরলীকৃত উদাহরণ নথি:

cat <<'EOT'
abc ` def
ghi \
jkl
EOT

এর মধ্যে একটি লাইনের শেষে একটি ব্যাকটিক এবং একটি ব্যাকস্ল্যাশ অন্তর্ভুক্ত রয়েছে। ডিলিমিটারটি উদ্ধৃত হয়, তাই দেহের অভ্যন্তরে কোনও প্রসার ঘটে না। বোর্ন-অ্যালাইক্সে আমি খুঁজে পেতে পারি বিষয়বস্তুটি শব্দটির বাইরে out আমি যদি কমান্ড সাবস্টিটিউশনের ভিতরে একই ডকুমেন্টটি রাখি:

x=$(cat <<'EOT'
abc ` def
ghi \
jkl
EOT
)
echo "$x"

তাহলে তারা আর অভিন্ন আচরণ করবে না:

  • dash, ash, zsh, ksh93, Busybox ash, mkshএবং SunOS 5.10 POSIX shসব নথির ধারণকৃত বিষয়বস্তু, আগের মতই দিতে।
  • 3.2 বাশটি তুলনামূলক ব্যাকটিকের জন্য একটি সিনট্যাক্স ত্রুটি দেয়। ম্যাচ করা ব্যাকটিক্স সহ এটি কমান্ড হিসাবে সামগ্রীগুলি চালনার চেষ্টা করে।
  • 4.3-এর বাশ একটি "লাই" এবং "জে কেএল" একটি একক লাইনে পতিত হয়েছে, তবে ত্রুটি নেই। --posixবিকল্প এই প্রভাব ফেলে না। কুসালানন্দ আমাকে বলেছেন (ধন্যবাদ!) যা pdkshএকইভাবে আচরণ করে

মূল প্রশ্নে, আমি বলেছিলাম এটি বাশের পার্সারে একটি বাগ ছিল was তাই কি? [আপডেট: হ্যাঁ ] পসিক্সের প্রাসঙ্গিক পাঠ্য (শেল কমান্ড ভাষার সংজ্ঞা থেকে সমস্ত) আমি খুঁজে পেতে পারি:

  • .62.6.3 কমান্ড সাবস্টিটিউশন :

    $ (কমান্ড) ফর্মের সাহায্যে মেলা বন্ধ হওয়া বন্ধনীতে ওপেন বন্ধনী অনুসরণকারী সমস্ত অক্ষর কমান্ডটি গঠন করে। কোনও বৈধ শেল স্ক্রিপ্ট কমান্ডের জন্য ব্যবহার করা যেতে পারে , কেবলমাত্র পুনর্নির্দেশের সমন্বিত স্ক্রিপ্ট ছাড়া যা অনির্দিষ্ট ফলাফল দেয় produces

  • .72.7.4 এখানে-নথি :

    যদি শব্দের কোনও অংশ উদ্ধৃত হয়, শব্দের উপর উদ্ধৃতি অপসারণ সম্পাদন করে ডিলিমিটারটি গঠিত হবে এবং এখানে নথির লাইনগুলি প্রসারিত হবে না।

  • Escape2.2.1 এস্কেপ চরিত্র (ব্যাকস্ল্যাশ) :

    যদি কোনও <নিউলাইন> <ব্যাকস্ল্যাশ> অনুসরণ করে তবে শেল এটি লাইন ধারাবাহিকতা হিসাবে ব্যাখ্যা করবে। টোকেনগুলিতে ইনপুট বিভক্ত করার আগে <ব্যাকস্ল্যাশ> এবং <নিউলাইন> সরানো হবে।

  • .32.3 টোকেন স্বীকৃতি :

    যখন একটি io_here টোকনটি ব্যাকরণ দ্বারা স্বীকৃত হয়েছে ( শেল ব্যাকরণ দেখুন ), পরবর্তী লাইনগুলির সাথে সাথে পরবর্তী নিউলাইন টোকেনের সাথে সাথে এক বা একাধিক এখানে-নথির দল গঠন করা হবে এবং এখানে নিয়ম অনুসারে পার্স করা হবে - ডকুমেন্ট

    যখন এটি কোনও আইও_ এখানে প্রক্রিয়া করছে না , শেলটি তার ইনপুটটিতে পরবর্তী অক্ষরের নীচে প্রথম প্রযোজ্য নিয়ম প্রয়োগ করে টোকেনগুলিতে তার ইনপুটটি ভেঙে দেবে। ...

    ...

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

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


  • এই পরিস্থিতি কি অন্য কোথাও পরিষ্কার হয়ে গেছে?
  • কোন পোর্টেবল স্ক্রিপ্টটি (তত্ত্ব অনুসারে) নির্ভর করতে সক্ষম হওয়া উচিত?
  • এই শাঁসের যে কোনও দ্বারা প্রদত্ত সুনির্দিষ্ট চিকিত্সা (বাশ 3.2 / বাশ 4.3 / প্রত্যেকে) মানক দ্বারা বাধ্যতামূলক? নিষিদ্ধ? অনুমোদিত হতে হবে?

আপনি কী আমাদের দ্বিতীয় ক্ষেত্রে আপনার আউটপুট উত্পাদন করতে পারেন?
জুলি পেলেটিয়ার

@ জুলিপেল্টিয়ার echo "$x", তবে ভেরিয়েবলের কাজগুলি পরিদর্শন করার যে কোনও উপায়। আমি লাইনটি নীচে সম্পাদনা করেছি।
মাইকেল হোমার

2
দেখে মনে হচ্ছে এটি একটি সহজ সমাধান। এই প্যাচটি কমপক্ষে কাজ করছে বলে মনে হচ্ছে: উপেক্ষা করুন_উক্ত_নিউজলাইন_ইন_কোটেড_হিরডোক.প্যাচ
গিরিহা

1
আমি মনে করি আপনি এটি সঠিকভাবে ব্যাখ্যা করছেন এবং ইমো স্ট্যান্ডার্ডটি বেশ স্পষ্ট যেহেতু "শেলটি একটি সাবহেল পরিবেশে কমান্ড প্রয়োগ করে কমান্ড প্রতিস্থাপনকে প্রসারিত করবে [...] এবং কমান্ড প্রতিস্থাপনের বদলে [...] এর মানক আউটপুট সহ কমান্ডটি [...] " সুতরাং এটি একটি সাবশেলে কমান্ডটি চালায় এবং $(...)যে আউটপুট তা হ'ল প্রতিস্থাপন করে ... এখন, আপনার উদাহরণে সাব-শেল (ইন bash) -তে কমান্ডটি চালানোর সময় এটি প্রত্যাশিত ফলাফলকে আউটপুট দেয়। এটি কেবলমাত্র কমান্ড প্রতিস্থাপনে পরিণত করার সময় এটি "ghi" এবং "jkl" ভেঙে যায়। সুতরাং এটি একটি বাগ ইমো
don_crissti

2
@geirha আমি একটি বাশ বাগ রিপোর্ট করেছি ; আমি পিডিক্স নিয়ে বিরক্ত করব না কারণ এটি বর্তমান রক্ষণাবেক্ষণের ছায়াও বলে মনে হচ্ছে না।
মাইকেল হোমার

উত্তর:


5

এটি বাশের মেইলিং তালিকায় জিজ্ঞাসা করা হয়েছিল, এবং রক্ষণাবেক্ষণকারী নিশ্চিত করেছেন যে এটি একটি বাগ

তারা আরও উল্লেখ করেছে যে পসিক্সের পাঠ্য "প্রয়োজনীয়ভাবে অস্পষ্ট নয়, তবে এটি নিবিড়ভাবে পড়া দরকার।", তাই আমি এ বিষয়ে স্পষ্টতা চেয়েছিলাম। সমস্যাগুলির বিবরণ এবং মানটির ব্যাখ্যা সহ তাদের উত্তর নিম্নরূপ ছিল:

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

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

পজিক্স ২.২.১-এ লেখাটি বিশ্রীভাবে লেখা হয়েছে, তবে এর অর্থ ব্যাকস্ল্যাশটি কেবলমাত্র বিশেষভাবে চিকিত্সা করা হবে যখন তা উদ্ধৃত হয়নি। আপনি একটি ব্যাকস্ল্যাশ উদ্ধৃত করতে পারেন এবং কেবলমাত্র একক উদ্ধৃতি বা অন্য কোনও ব্যাকস্ল্যাশ দিয়ে সমস্ত বিস্তৃতি বাধা দিতে পারেন।

নিকট পাঠের অংশটি হ'ল "প্রসারিত নয়" পাঠ্যটি একক উদ্ধৃতি বোঝায়। স্ট্যান্ডার্ডটি ২.২-এ বলেছে যে এখানে নথিগুলি "উদ্ধৃতি দেওয়ার অন্য রূপ," তবে উদ্ধৃত করার একমাত্র ফর্ম যা শব্দের মোটেও প্রসারিত হয় না তা হ'ল একক উদ্ধৃতি। সুতরাং এটি উদ্ধৃত করার একটি ফর্ম যা ঠিক একক উদ্ধৃতিগুলির মতো, তবে একক উদ্ধৃতি নয় quot


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

আমার বক্তব্যটি ছিল যে আপনার প্রথম অনুচ্ছেদটি মাইকেল মরোজেকের সাথে কথোপকথন এবং প্রশ্নের উত্তর নয়। আমি বুঝতে পারি যে কোনও পোস্টে মন্তব্য করার মতো যথেষ্ট খ্যাতি আপনার নেই, তবে আমি বিশ্বাস করি যে মেটা এবং আড্ডার জন্য আপনার যথেষ্ট পরিমাণ আছে।
স্কট

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