বাশ ট্যাব সমাপ্তি: '-বাশ: matching মেলানোর সময় অনাকাঙ্ক্ষিত ইওএফ)' -বাশ: সিনট্যাক্স ত্রুটি: ফাইলের অপ্রত্যাশিত শেষ


18

আমি irbএই কমান্ডের সাহায্যে একটি ফাইল থেকে নির্দিষ্ট পরিবেশের ভেরিয়েবলগুলির সাথে একটি সেশনে যাওয়ার চেষ্টা করছি :

$ env $(cat env.sh) irb

আমি যখন এটি সম্পূর্ণ করার জন্য Tabটাইপ env.করার পরে টিপতে চেষ্টা করব তখন আমি এই নিম্নলিখিত ত্রুটিটি পেয়েছি:

$ env $(cat env.-bash: unexpected EOF while looking for matching `)'
-bash: syntax error: unexpected end of file

আর একটি আকর্ষণীয় বিষয় হ'ল আমি যদি রুট হিসাবে লগ ইন করি তবে এই ত্রুটিটি ঘটে না।

এর ফলাফল এখানে find ~ -uid 0:

$ find ~ -uid 0
/home/(redacted)/.rpmdb
/home/(redacted)/.rpmdb/Group
/home/(redacted)/.rpmdb/Conflictname
/home/(redacted)/.rpmdb/Installtid
/home/(redacted)/.rpmdb/Sha1header
/home/(redacted)/.rpmdb/Providename
/home/(redacted)/.rpmdb/__db.002
/home/(redacted)/.rpmdb/Requirename
/home/(redacted)/.rpmdb/Sigmd5
/home/(redacted)/.rpmdb/__db.001
/home/(redacted)/.rpmdb/Obsoletename
/home/(redacted)/.rpmdb/.dbenv.lock
/home/(redacted)/.rpmdb/Name
/home/(redacted)/.rpmdb/Basenames
/home/(redacted)/.rpmdb/Triggername
/home/(redacted)/.rpmdb/Packages
/home/(redacted)/.rpmdb/Dirnames
/home/(redacted)/.rpmdb/__db.003

কেউ আমাকে ব্যাখ্যা করতে পারে যে এটি কেন হচ্ছে এবং যদি তাই হয় তবে আমি যখন এটি কোনও রুট ব্যবহারকারী নই তবে আমি কীভাবে এটি ঠিক করব?


আপনি কিভাবে রুট হিসাবে লগ ইন করবেন?
মুড়ু

@ মুরু আমি ব্যবহার করে মূলটিতে লগইন করেছি sudo su
ওড়োসোয়া

এর আউটপুট যুক্ত করতে দয়া করে আপনার প্রশ্নটি সম্পাদনা করুন find ~ -uid 0
মুড়ু

@ মুরু সম্পন্ন আমার প্রশ্নের আউটপুট যুক্ত।
ওড়োসোয়

সে সম্পর্কে দুঃখিত, তবে মূল হিসাবে নয়! যাতে আমি তোমাদের সাধারণ ব্যবহারকারী হিসেবে বোঝানো ~হয় /home/something
মুড়ু

উত্তর:


33

আপনি উবুন্টু দ্বারা ব্যবহৃত ব্যাশ সমাপ্তি লাইব্রেরিতে একটি বাগ খুঁজে পেয়েছেন ।

এটার মানে কি?

উশুন্টু ব্যাশ সমাপ্তি স্মার্ট করতে ব্যাশ সমাপ্তির পাঠাগার ব্যবহার করে। এই গ্রন্থাগারটি বাস করে /usr/share/bash-completion/bash_completion

মূলত, এই গ্রন্থাগারটি কয়েকটি চালাক ফাংশন ঘোষণা করে যা সাধারণ কমান্ডগুলি এবং সেগুলি কীভাবে সম্পন্ন করতে হয় সে সম্পর্কে জানে। আপনি যখনই টিপুন Tab, এই লাইব্রেরির মধ্যে ফাংশনগুলি কল হবে এবং আপনার বর্তমান কমান্ড লাইনটি সম্পূর্ণ করার চেষ্টা করবে। সুতরাং উদাহরণস্বরূপ আপনি যদি apt-get iTabএটি টাইপ করেন তবে এটি সম্পূর্ণ হবে apt-get install। আপনি যদি সেই লাইব্রেরিটি উত্স না করেন তবে আপনার কেবল মানক, আদিম বাশ সমাপ্তি রয়েছে - উদাহরণস্বরূপ আপনি যদি apt-get iTabএটি স্রোস না করে টাইপ করেন তবে ব্যাশ কেবলমাত্র বর্তমান ডিরেক্টরিতে শুরু হওয়া ফাইলগুলির সন্ধান করবে 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হ্যাকটি অন্য একটি সমস্যার সমাধান করার কথা ছিল , তবে আমার ধারণা এটি প্রক্রিয়াতে এই অন্যান্য বাগটি প্রবর্তন করেছিল।

আমি কীভাবে এটি ঠিক করব?

দেখা যাচ্ছে যে এই বাগটি ইতিমধ্যে প্রতিবেদন করা হয়েছে । এই বাগ রিপোর্টটি পড়ার পরে, আমি এটি ঠিক করার জন্য তিনটি উপায় দেখছি:

  1. এটি প্যাচ করুন: bu বাগের প্রতিবেদনের একটি মন্তব্যে কেউ লাইনটি প্রতিস্থাপন করার পরামর্শ দিয়েছেন

    [[ ${!2} == \$* ]] && eval $2=${!2}

    লাইন দ্বারা _quote_readline_by_refফাইলের মধ্যে ফাংশন মধ্যে/usr/share/bash-completion/bash_completion

    [[ ${!2} == \$\'* ]] && eval $2=${!2}

    আমি এটি করার বিরুদ্ধে সুপারিশ করছি। যে মন্তব্যটি লিখেছেন সে ব্যাশ-সমাপ্তির বিকাশকারী হিসাবে উপস্থিত হবে না । এই হটফিক্স কেবলমাত্র বিবৃতিটির বাম ক্রিয়াকলাপকে মিথ্যা হিসাবে মূল্যায়িত করবে এবং এটি evalঘটতে বাধা দেবে। তবে সেই ফাংশনটি কী করণীয় এবং কী প্রসঙ্গে এটি বলা হয় সে সম্পর্কে ভাল ধারণা ছাড়াই এটি স্পষ্ট নয় যে এটি সম্ভাব্যভাবে অন্য কিছু উদ্দেশ্যযুক্ত কার্যকারিতা ভঙ্গ করবে কিনা।

  2. নবীনতম সংস্করণটি পান: এই বাগের প্রতিবেদনে যেমন উল্লেখ করা হয়েছে, এই বাগটি গিট মাথাতে উপস্থিত নেই (যেখানে অন্যান্য পরিবর্তনগুলির মধ্যে ফাংশনটি _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 টুশে বিভক্ত।

  1. পিছনে বসে অপেক্ষা করুন: শীঘ্রই বা খুব শীঘ্রই একটি নতুন সংস্করণ প্রকাশিত হবে (যা কমান্ড প্রতিস্থাপনের মধ্যে বাশ সম্পূর্ণ হওয়া ঠিক করতে পারে) এবং আপনি এটি ভবিষ্যতের কিছু উবুন্টু সংস্করণ সহ পাবেন। এটাই আমি যাচ্ছি ;-)

1
@ কন-এফ-ব্যবহার হ্যাঁ, এটাই! গিট রেপো বাশ-সমাপ্তির মূল সাইট থেকেও সংযুক্ত , এ কারণেই আমি আমার উত্তরে এর সাথে লিঙ্ক পাইনি।
মাল্টে স্কোরুপা

2
@ কন-এফ-ব্যবহার আপনার মন্তব্য আমাকে এই বাগ সম্পর্কে আরও কিছু গবেষণা করতে বাধ্য করেছিল। দেখা যাচ্ছে এটি একটি উজানের ত্রুটি নয় এবং কখনও ছিল না। পরিবর্তে, এটি আসলে উবুন্টু প্যাচ দ্বারা প্রবাহিত সংস্করণের বিপরীতে প্রয়োগ করা একটি বাগ। কোনও ত্রুটি এখনও এই নির্দিষ্ট প্যাচে সংকীর্ণ হয়েছে বলে মনে হচ্ছে না। সুতরাং আমি সম্পর্কিত উবুন্টু বাগ প্রতিবেদনে আমার অনুসন্ধানের প্রতিবেদন করেছি: bugs.launchpad.net/ubuntu/+source/bash-completion/+bug/1312243
মাল্টে স্কোরুপা

2
ভাল কাজ মাল্টে।
ব্যারি কেলি

1
বর্নানার জন্য ধন্যবাদ. এই লেখার হিসাবে, গিট শিরোনাম সংস্করণটি ইচ্ছামত বাগ এবং অটোকম্প্লেটগুলি সরিয়েছে । সম্পাদনা: আসলে, কিছুই নয় it
ব্যবহারকারী 3391564

1
@MaxvonHippel আমি বললাম যে, যখন আপনি ব্যবহার sudo suকরে root হওয়া, এটা গ্রন্থাগার উৎস নয়, কিন্তু এটি হবে যখন আপনি ব্যবহার sourced পেতে sudo -iযা একটি ইন্টারেক্টিভ রুট অধিবেশন পেতে উদ্দেশ্যে পথ বদলে। আপনার প্রশ্নের হিসাবে: যেহেতু কোনও ব্যাশ শেল পড়তে পারে ~/.bashrcযা শেষ পর্যন্ত গ্রন্থাগারের উত্স, এবং কোনও ফাইলকে "আনসোর্স" করার কোনও উপায় নেই, তাই আমি কোনও সম্পূর্ণ সোজা উপায় দেখছি না। এখানে একটি সম্ভাব্য হ্যাক হল: কিছু এনভায়রনমেন্ট ভেরিয়েবল উপর গ্রন্থাগার শর্তসাপেক্ষ এর গুন করুন, বলুন, NOCOMPL, না আপনার সংজ্ঞায়িত হচ্ছে ~/.bashrc...
Malte Skoruppa
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.