আপনি উবুন্টু দ্বারা ব্যবহৃত ব্যাশ সমাপ্তি লাইব্রেরিতে একটি বাগ খুঁজে পেয়েছেন ।
এটার মানে কি?
উশুন্টু ব্যাশ সমাপ্তি স্মার্ট করতে ব্যাশ সমাপ্তির পাঠাগার ব্যবহার করে। এই গ্রন্থাগারটি বাস করে /usr/share/bash-completion/bash_completion
।
মূলত, এই গ্রন্থাগারটি কয়েকটি চালাক ফাংশন ঘোষণা করে যা সাধারণ কমান্ডগুলি এবং সেগুলি কীভাবে সম্পন্ন করতে হয় সে সম্পর্কে জানে। আপনি যখনই টিপুন Tab, এই লাইব্রেরির মধ্যে ফাংশনগুলি কল হবে এবং আপনার বর্তমান কমান্ড লাইনটি সম্পূর্ণ করার চেষ্টা করবে। সুতরাং উদাহরণস্বরূপ আপনি যদি apt-get i
Tabএটি টাইপ করেন তবে এটি সম্পূর্ণ হবে apt-get install
। আপনি যদি সেই লাইব্রেরিটি উত্স না করেন তবে আপনার কেবল মানক, আদিম বাশ সমাপ্তি রয়েছে - উদাহরণস্বরূপ আপনি যদি apt-get i
Tabএটি স্রোস না করে টাইপ করেন তবে ব্যাশ কেবলমাত্র বর্তমান ডিরেক্টরিতে শুরু হওয়া ফাইলগুলির সন্ধান করবে i
এবং আপনার আদেশ অনুসারে আপনার কমান্ডটি সম্পূর্ণ করার চেষ্টা করবে এই ফাইলের নাম।
কেন এটি মূল হিসাবে ঘটছে না?
কারণ আপনি যখন sudo su
নিজেকে তৈরি করতে ব্যবহার করেন root
, তখন ব্যাশ সমাপ্তির পাঠাগারটি উত্সাহিত হয় না। যদি আপনি sudo -i
নিজেকে তৈরি করতেন তবে এটি আলাদা হবে root
। আমি বাজি ধরছি আপনি তখন বাগ দেখতে পাচ্ছেন, তাই না? উদাহরণস্বরূপ দেখুন 'সুডো সু -' বনাম 'সুডো-আই' বনাম 'সুডো / বিন / বাশ' - এটি ব্যবহৃত হয় যা ব্যবহৃত হয় তা কখনই বিবেচনা করে না, বা আদৌ তা বিবেচনা করে? আপনি যদি পার্থক্যগুলির সাথে পরিচিত না হন।
আমার ক্ষেত্রে, একজন সাধারণ ব্যবহারকারী হিসাবে, আমি যখন বাশ শেল শুরু করি তখন গ্রন্থাগারটি সোর্স হয়ে যায় কারণ ~/.bashrc
উত্সগুলি /etc/bash_completion
উত্স /usr/share/bash-completion/bash_completion
।
আমি যদি sudo -i
লগইন হিসাবে ব্যবহার করি root
তবে গ্রন্থাগারটি সোর্স হয়ে যায় কারণ /etc/profile
উত্সগুলি /etc/profile.d/bash_completion.sh
উত্স /usr/share/bash-completion/bash_completion
।
কেন যে বাগ ঘটছে?
এই আদেশটি কার্যকর করার চেষ্টা করুন:
$ eval 'quoted=$(cat' env.
bash: unexpected EOF while looking for matching `)'
bash: syntax error: unexpected end of file
চেনা লাগছে? ;-) প্রকৃতপক্ষে, Tabআপনি বর্ণিত প্রসঙ্গে হিট করার সময় পর্দার আড়ালে ঠিক এটি ঘটেছিল । আরও স্পষ্টভাবে, বাগটি _quote_readline_by_ref
ঘোষিত ফাংশনে রয়েছে /usr/share/bash-completion/bash_completion
। আপনি যদি সেই ফাইলটি উত্সাহিত করেন তবে আপনার সেই ফাংশনটি পাওয়া উচিত। সুতরাং পরবর্তী এটি চেষ্টা করুন:
$ _quote_readline_by_ref '$(cat env.' quoted
bash: unexpected EOF while looking for matching `)'
bash: syntax error: unexpected end of file
এই যুক্তিগুলি দেওয়া, ফাংশনটি উপরে উল্লিখিত _quote_readline_by_ref
অন্যান্য বিষয়গুলির মধ্যেও সম্পাদন করে eval
। আপনি যদি চান চান একটি চেহারা পেতে পারেন। এবং আপনি যখন টাইপ করেন env $(cat env.
Tab, সেই দৃশ্যের পিছনে যে ফাংশনটি ঠিক সেই আর্গুমেন্টগুলির সাথে ডাকে। সুতরাং যা ঘটেছে।
এই eval
হ্যাকটি অন্য একটি সমস্যার সমাধান করার কথা ছিল , তবে আমার ধারণা এটি প্রক্রিয়াতে এই অন্যান্য বাগটি প্রবর্তন করেছিল।
আমি কীভাবে এটি ঠিক করব?
দেখা যাচ্ছে যে এই বাগটি ইতিমধ্যে প্রতিবেদন করা হয়েছে । এই বাগ রিপোর্টটি পড়ার পরে, আমি এটি ঠিক করার জন্য তিনটি উপায় দেখছি:
এটি প্যাচ করুন: bu বাগের প্রতিবেদনের একটি মন্তব্যে কেউ লাইনটি প্রতিস্থাপন করার পরামর্শ দিয়েছেন
[[ ${!2} == \$* ]] && eval $2=${!2}
লাইন দ্বারা _quote_readline_by_ref
ফাইলের মধ্যে ফাংশন মধ্যে/usr/share/bash-completion/bash_completion
[[ ${!2} == \$\'* ]] && eval $2=${!2}
আমি এটি করার বিরুদ্ধে সুপারিশ করছি। যে মন্তব্যটি লিখেছেন সে ব্যাশ-সমাপ্তির বিকাশকারী হিসাবে উপস্থিত হবে না । এই হটফিক্স কেবলমাত্র বিবৃতিটির বাম ক্রিয়াকলাপকে মিথ্যা হিসাবে মূল্যায়িত করবে এবং এটি eval
ঘটতে বাধা দেবে। তবে সেই ফাংশনটি কী করণীয় এবং কী প্রসঙ্গে এটি বলা হয় সে সম্পর্কে ভাল ধারণা ছাড়াই এটি স্পষ্ট নয় যে এটি সম্ভাব্যভাবে অন্য কিছু উদ্দেশ্যযুক্ত কার্যকারিতা ভঙ্গ করবে কিনা।
নবীনতম সংস্করণটি পান: এই বাগের প্রতিবেদনে যেমন উল্লেখ করা হয়েছে, এই বাগটি গিট মাথাতে উপস্থিত নেই (যেখানে অন্যান্য পরিবর্তনগুলির মধ্যে ফাংশনটি _quote_readline_by_ref
সরল করা হয়েছে)। আপনি কেবল গিট থেকে বর্তমান রিভিশনটি ক্লোন করতে পারেন:
git clone https://salsa.debian.org/debian/bash-completion.git
... এবং তারপরে bash_completion
স্ক্রিপ্টের সর্বশেষতম সংস্করণটি অনুলিপি করুন /usr/share/bash-completion
(পুরাতন সংস্করণটিকে ব্যাকআপ করার জন্য জরুরী প্রয়োজন নেই যদি না এটি আপনাকে সুরক্ষিত বোধ করে - আপনি যদি কিছু সমস্যা অনুভব করেন তবে আপনার sudo apt-get install --reinstall bash-completion
জরিমানা করা কোনও পরিবর্তন ফিরে পাওয়া উচিত)) এভাবেই আমি আপনি এই সংশোধন করার জন্য তাড়াহুড়া করছেন কিনা সুপারিশ। :-)
নোট করুন যে এই সমাধানগুলির কোনওটিই কমান্ড প্রতিস্থাপনের কাজের ভিতরে বাশ সম্পূর্ণ করতে পারবে না: একই বাগ রিপোর্টে উল্লিখিত হিসাবে, এটি 4.3 টুশে বিভক্ত।
- পিছনে বসে অপেক্ষা করুন: শীঘ্রই বা খুব শীঘ্রই একটি নতুন সংস্করণ প্রকাশিত হবে (যা কমান্ড প্রতিস্থাপনের মধ্যে বাশ সম্পূর্ণ হওয়া ঠিক করতে পারে) এবং আপনি এটি ভবিষ্যতের কিছু উবুন্টু সংস্করণ সহ পাবেন। এটাই আমি যাচ্ছি ;-)