এটি একটি খুব অস্পষ্ট কোণার কেস যা কিনা পরীক্ষা [
-নিরীক্ষণটি সংজ্ঞায়িত করা হয় তাতে একটি বাগ বিবেচনা করতে পারে ; তবে এটি [
অনেক সিস্টেমে উপলব্ধ প্রকৃত বাইনারিগুলির ব্যবহারের সাথে মেলে না । যতদুর আমি বলতে পারেন, এটি শুধুমাত্র নির্দিষ্ট ক্ষেত্রে এবং একটি পরিবর্তনশীল যে একটি ম্যাচ একটি মান না থাকার প্রভাবিত [
মত অপারেটর (
, !
, =
, -e
, ইত্যাদি।
বাশ এবং পসিক্স শেলগুলিতে কেন এবং কীভাবে এটি ব্যবহার করা যায় তা আমাকে ব্যাখ্যা করতে দিন।
ব্যাখ্যা:
নিম্নোক্ত বিবেচনা কর:
x="("
[ "$x" = "(" ] && echo yes || echo no
সমস্যা নেই; উপরেরটি কোনও ত্রুটি এবং ফলাফল দেয় না yes
। আমরা স্টাফগুলি এইভাবে কাজ করার আশা করি। আপনি '1'
যদি তুলনামূলক স্ট্রিংটি পছন্দ করেন তবে এর মান এবং এর মানটি পরিবর্তন করতে পারেন x
এবং এটি প্রত্যাশার মতো কাজ করবে।
নোট করুন যে আসল /usr/bin/[
বাইনারি একইভাবে আচরণ করে। আপনি যদি চালনা করেন যেমন '/usr/bin/[' '(' = '(' ']'
কোনও ত্রুটি নেই কারণ প্রোগ্রামটি সনাক্ত করতে পারে যে আর্গুমেন্টগুলিতে একটি স্ট্রিং তুলনা অপারেশন রয়েছে।
বাগটি ঘটে যখন আমরা এবং দ্বিতীয় প্রকাশ করি expression দ্বিতীয় অভিব্যক্তিটি যতক্ষণ তা বৈধ হবে তা বিবেচ্য নয়। উদাহরণ স্বরূপ,
[ '1' = '1' ] && echo yes || echo no
ফলাফল yes
এবং এটি অবশ্যই একটি বৈধ এক্সপ্রেশন; তবে, যদি আমরা দুটোকে একত্রিত করি,
[ "$x" = "(" -a '1' = '1' ] && echo yes || echo no
বাশ এক্সপ্রেশনটিকে প্রত্যাখ্যান করে যদি এবং কেবল x
হয় (
বা হয় !
।
আমরা যদি প্রকৃত [
প্রোগ্রামটি ব্যবহার করে উপরেরটি চালিত করি তবে
'/usr/bin/[' "$x" = "(" -a '1' = '1' ] && echo yes || echo no
ত্রুটিটি বোধগম্য হবে: যেহেতু শেলটি পরিবর্তনশীল বিকল্পগুলি করে, /usr/bin/[
বাইনারি কেবল পরামিতি (
=
(
-a
1
=
1
এবং সমাপ্তি গ্রহণ করে]
, বোধগম্যভাবে খোলা বন্ধনীগুলি একটি সাব-এক্সপ্রেশন শুরু করে কিনা তা পার্স করতে ব্যর্থ হয়, সেখানে একটি এবং অপারেশন জড়িত রয়েছে। অবশ্যই, দুটি স্ট্রিং তুলনা হিসাবে এটিকে পার্স করা সম্ভব, তবে বন্ধুত্বপূর্ণ সাব-এক্সপ্রেশনগুলির সাথে যথাযথ অভিব্যক্তিতে প্রয়োগ করার সময় লোভের সাথে এটি করা সমস্যার কারণ হতে পারে।
সমস্যা, সত্যই, এটি শেল [
অন্তর্নির্মিত একইভাবে আচরণ করে, যেন এটি x
এক্সপ্রেশনটি পরীক্ষা করার আগে এর মানকে প্রসারিত করে ।
(এই অস্পষ্টতা এবং পরিবর্তনশীল প্রসারণ সম্পর্কিত অন্যান্য, বাশ কার্যকর করার জন্য একটি বড় কারণ ছিল এবং এখন এটি ব্যবহার করার পরামর্শ দেয় [[ ... ]]
পরিবর্তে পরীক্ষামূলক অভিব্যক্তি ))
কর্মক্ষেত্রটি তুচ্ছ এবং প্রায়শই পুরানো sh
শাঁস ব্যবহার করে স্ক্রিপ্টগুলিতে দেখা যায় । x
স্ট্রিং তুলনা হিসাবে অভিব্যক্তিটি স্বীকৃত হয়েছে তা নিশ্চিত করার জন্য আপনি প্রায়শই স্ট্রিংগুলির (উভয় মানের তুলনা করা হচ্ছে) সামনে একটি "নিরাপদ" চরিত্র যুক্ত করেন :
[ "x$x" = "x(" -a "x$y" = "x1" ]
[[ "$x" = '1' && "$y" = '1' ]]