খালি স্ট্রিংয়ের ফলে প্যারামিটারের বিস্তৃতি আলাদাভাবে চিকিত্সা করা হয়


10

হালনাগাদ

বাগ-ব্যাশ মেলিং তালিকার কেউ নিশ্চিত করেছেন যে এটি একটি বাগ।


যদি কারও আগ্রহী হয় তবে সর্বশেষ প্রতিশ্রুতিটি বিকাশ করতে একটি ফিক্স পাওয়া যায় ।


যদিও

bash -c 'echo "${1##*""}"' _ bar

খালি লাইন ছাপায়,

bash -c 'echo "${1##*"${1##*}"}"' _ bar

কপি করে প্রিন্ট bar

আমি এটা বুঝতে পারি না। ${1##*}একটি খালি স্ট্রিংয়ে প্রসারিত হয়, তাই "${1##*}"ঠিক যেমন আচরণ করা উচিত ""তবে বাশ মনে হয় না বলে মনে হয়।

অন্যান্য জনপ্রিয় shবাস্তবায়নের মধ্যে এটি সম্পর্কে একটি beক্যমত্য বলে মনে হচ্ছে :

$ sh -c 'echo "${1##*"${1##*}"}"' _ bar

$ ash -c 'echo "${1##*"${1##*}"}"' _ bar

$ dash -c 'echo "${1##*"${1##*}"}"' _ bar

$ ksh -c 'echo "${1##*"${1##*}"}"' _ bar

$ ksh93 -c 'echo "${1##*"${1##*}"}"' _ bar

$ mksh -c 'echo "${1##*"${1##*}"}"' _ bar

$ posh -c 'echo "${1##*"${1##*}"}"' _ bar

$ yash -c 'echo "${1##*"${1##*}"}"' _ bar

$ zsh -c 'echo "${1##*"${1##*}"}"' _ bar

$

বাশ (সাথে বা বাইরে --posix) কেবলমাত্র এটিই মেনে চলে না:

$ bash -c 'echo "${1##*"${1##*}"}"' _ bar
bar

এবং প্রক্রিয়াকরণ জিনিসপত্র বিহীন আচরণটি প্রত্যাশার মতো:

$ bash -c 'echo "${1##*"${1+}"}"' _ bar

$ bash -c 'echo "${1##*"${2}"}"' _ bar

$ bash -c 'echo "${1##*"${2}"}"' _ bar ''

$ 

আমি সত্যিই আশ্চর্য হয়েছি যে এর কোনও ব্যাখ্যা আছে, যা আমি ম্যানুয়ালটিতে খুঁজে পাইনি। এটি কি কোনও বাগ, বা মানটির ভুল ব্যাখ্যা? এই আচরণ কোথাও নথিভুক্ত করা হয়?


পিএস: আমি জানি একটি দ্রুত কাজটি হ'ল অভ্যন্তরীণ পিইকে উদ্ধৃত করা, তবে এটি আমার প্রশ্নের উত্তর দেয় না এবং বিশেষ অক্ষরযুক্ত স্ট্রিংগুলি নিয়ে অনাকাঙ্ক্ষিত ফলাফলের দিকে নিয়ে যেতে পারে।


GNU bash, version 3.2.57(1)-release (x86_64-apple-darwin18)একটি খালি স্ট্রিং প্রিন্ট করে
উইলিয়াম পার্সেল

GNU bash, version 4.4.12(1)-release (x86_64-pc-linux-gnu)"বার" প্রিন্ট করুন
উইলিয়াম পার্সেল

@ উইলিয়াম 4.4.20 এবং 5.0.11 এ পরীক্ষিত হয়েছে এবং উভয়ই "বার" মুদ্রণ করেছে
ওগুজ ইসমাইল

এটি সাধারণত সম্প্রসারণে সমস্যা বলে মনে হচ্ছে। আমার 4.4.12(3)-release, echo "${BASH##*"${BASH##*}"}"-> এ /bin/bashecho "\${BASH##*"${BASH##*}"}"-> ${BASH##*}এবং eval echo "\${BASH##*"${BASH##*}"}"-> ফাঁকা থাকাকালীন ।
জেফ ওয়াই

উত্তর:


2

এটি কোনও উত্তর নয়

প্রথমে আমি ভাবছিলাম যে এটি বিশেষ গ্লোব-বিধিগুলির কারণে, তবে শেষ পর্যন্ত আমি মনে করি এটি ব্যাশের একটি বাগ। নিম্নলিখিত চারটি উদাহরণে আপনাকে একটি বোধ করা উচিত কেন আমি বিশ্বাস করি এটি একটি বাগ:

$ bash -c 'echo "${1##*${1%%bar}}"' _ foobar        # case 1
bar
$ bash -c 'echo "${1##*${1%%foobar}}"' _ foobar     # case 2

$ bash -c 'echo "${1##*"${1%%bar}"}"' _ foobar      # case 3
bar
$ bash -c 'echo "${1##*"${1%%foobar}"}"' _ foobar   # case 4
foobar

কেস 1 এবং কেস 3 উদ্ধৃতিগুলির মধ্যে পৃথক। তবে ফর্মের প্যারামিটার সম্প্রসারণ ${parameter##word}প্রক্রিয়াটির জন্য পথের নাম প্রসারণের নিয়ম ব্যবহার করে word। সুতরাং *fooএবং *"foo"পথনাম সম্প্রসারণ মধ্যে ডাবল কোট হিসাবে অভিন্ন আচরণ উপেক্ষা করা যাবে যদি না তারা বিশেষ প্যাটার্ন অক্ষর আলিঙ্গন আছে ( *, ?, ...)। এটি নিম্নলিখিত উদাহরণে দেখা যায়:

$ bash -c 'echo "${1##*${2%%b*r}}"' _ 'foobar' 'f*ob*r'
bar
$ bash -c 'echo "${1##*"${2%%b*r}"}"' _ 'foobar' 'f*ob*r'
foobar

সুতরাং যদি এটি হয় তবে কেস 2 এবং কেস 4 এর সাথে আলাদা আচরণ করা উচিত?


কেস 2 এবং কেস 4 এর আলাদা আচরণ করা উচিত কেন? কোনও কারণ নেই, উভয়ই ${1+}এবং ${1+""}খালি স্ট্রিংয়ে প্রসারিত হয় তবে তাদের সাথে চিকিত্সা করা হয় না ${1##*}(আমার সর্বশেষ সম্পাদনাটি দেখুন)। এইভাবে আমরা এটি একটি বাগ ঠিক করতে পারি, তাই না?
ওগুজ ইসমাইল

1
@oguzismail হুবহু! যদি কেস 1 এবং কেস 3 একই আচরণ করে তবে কেস 2 এবং কেস 4 এর ক্ষেত্রেও একইরকম আচরণ করা উচিত।
কাঁভন্তর
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.