বাশ সম্পূর্ণ হওয়া ধীরে ধীরে ব্যাশ শুরু করে


15

আমার উবুন্টু সিস্টেমে ব্যাশ শুরু করতে প্রায় 2 সেকেন্ড সময় লাগে। আমি .bashrc এ লোডিং / ইত্যাদি / বাশ_কম্পলেটটি সরিয়ে ফেললে দেরি না করে এটি শুরু হয়। অবশ্যই আমি পরিপূর্ণতা ছেড়ে দিতে চাই না এবং আমি মনে করি না যে ফাইলটি লোড করা 2 সেকেন্ড বিলম্বের বৈধ কারণ।

সমস্যা কী তা আমি কীভাবে খুঁজে পেতে পারি বা কীভাবে জিনিসগুলিকে গতিময় করতে পারি তা কোনও ধারণা।


এটা কি / বিন / বাশ? - চেষ্টা করুন / বিন / ড্যাশ কিছুটা দ্রুত হতে পারে।
সাইরেক্স

3
এই কারণেই আমি বাশ-সমাপ্তিটি স্থির করে দিয়েছিলাম
vi।

উত্তর:


8

২০১৩-তে আপডেট: কেবলমাত্র প্রয়োজনের সময় ব্যাশ-সমাপ্তির বেশিরভাগটি অটোল্যাড কমপ্লিমেন্টগুলিতে পুনরায় লেখা হয়েছিল। মূল স্ক্রিপ্ট এখন অনেক বেশি জিগের।


সমাপ্তি স্ক্রিপ্ট কখনও কখনও শেল স্ক্রিপ্ট স্ট্যান্ডার্ডে বিশাল হতে পারে । একটি সার্ভারে আমার অ্যাক্সেস রয়েছে এটি প্রায় 1700 লাইন (57 কেবি) এবং এটি কেবল মূল স্ক্রিপ্ট । ইন /etc/bash_completion.dআছে ~ অন্যান্য বিভিন্ন কমান্ডের জন্য 200 অতিরিক্ত স্ক্রিপ্ট ( openssl, mutt, mount...) 25537 লাইন বা 1.2 মেগাবাইট মোট। প্রতিটি স্ক্রিপ্ট, উত্সাহিত হয়ে গেলে, সমাপ্তি হ্যান্ডলারের সংজ্ঞা দেওয়ার আগে একটি আদেশ আসলে পাওয়া যায় কিনা তা পরীক্ষা করে; এই ক্ষেত্রে 30 330 বার, যার প্রত্যেকটিতে $PATHএকটি প্রদত্ত নামের সাথে এক্সিকিউটেবল ফাইলের জন্য পরীক্ষা করা জড়িত । (যদিও আমি /usr/binস্মৃতিতে ক্যাশে হবে আশা করি ...)

স্বীকার করা যায়, এমনকি এটি লোড হতে কেবল আধা সেকেন্ড সময় নেয়, পুরো দুটি সেকেন্ড নয়। তবে এটি সমস্যার অন্তত অংশ হতে পারে। চালান du -hs /etc/bash_completion*বা wc -l /etc/bash_completion{,.d/*} | grep totalযদি আপনি চেক করতে চান।


আপনি "ট্রেস" মোডে স্ক্রিপ্টটি ম্যানুয়ালি সোর্স করার চেষ্টা করতে পারেন:

set -x
. /etc/bash_completion

প্রতিটি লাইন কার্যকর হওয়ার সাথে সাথে আপনি দেখতে পাবেন। যদি এমন কোনও নির্দিষ্ট আদেশ থাকে যা দীর্ঘ সময় নেয়, আপনার এটি লক্ষ্য করা উচিত।

( set +xট্রেস মোড অক্ষম করে))


সরল টেক্সট মোডে এমনকি বিচক্ষণ বৈশিষ্ট্য? এটি আপনার ভাবার চেয়ে সম্ভাবনা বেশি।
vi।

@ ভিআই: জেডএস দেখার পরে তার স্টার্টআপের স্ক্রিপ্টগুলি বাইটকোডে সংকলন করুন ...
ব্যবহারকারীর6868

1
ধন্যবাদ. Thats সত্যিই সহজ ছিল। দুঃখজনকভাবে সমস্ত কমান্ড পৃথকভাবে লক্ষণীয় ছিল না। সুতরাং এটি দেখে মনে হচ্ছে এটি প্রকৃতপক্ষে বিশাল পরিমাণ যা সমস্যা সৃষ্টি করছে।
ব্যবহারকারী 75250

12

আমি কিছুটা হ্যাকিশ সমাধান পেয়েছি যা দেখে মনে হয় মোটামুটি যথেষ্ট কাজ করে।

সমাধান

অ্যাডের নীচে ~/.bashrc:

ফাঁদ 'উত্স / ইত্যাদি / bash_completion; ফাঁদ USR1 'USR1
{ঘুম 0.1; বিল্টিন কিল-ইউএসআর 1 $$; } & অস্বীকার করুন

ব্যাখ্যা

trap 'source /etc/bash_completion ; trap USR1' USR1

শেলটি সিগন্যাল পেলে চালানোর জন্য একটি হ্যান্ডলার সেটআপ করুন SIGUSR1; হ্যান্ডলার পরিপূর্ণতা লোড করবে এবং তাই এটি নিজেই নিষ্ক্রিয় হবে।

{ sleep 0.1 ; builtin kill -USR1 $$ ; } & disown

অ্যাসিঙ্ক্রোনালি কিছুটা অপেক্ষা করুন তারপরে বর্তমান শেলটিতে সিগন্যালটি প্রেরণ করুন। প্রক্রিয়া নিয়ন্ত্রণ প্রতিক্রিয়া disownদমন করা প্রয়োজন bashsleepঅবিচ্ছিন্নভাবে কাজ করার প্রয়োজন।

সমস্যা

কিছু কারণে এই শেলটিতে জারি করা প্রথম কমান্ড ইতিহাসে রেকর্ড করা হবে না।


1
এটি একটি প্রারম্ভিক উত্সাহ দেবে বলে মনে হচ্ছে না - time bash -lc true0.26 এর মতো উচ্চতর সংখ্যার time source /etc/bash_completionপ্রতিবেদন করা সত্ত্বেও or 0.12 এর সাথে বা এটি ছাড়া রিপোর্ট করে । এটি কার্যকরভাবে সংশোধন করা হয়েছে ?
l0b0

আমি time bash -lc trueএখানে জানি না যে এখানে ঠিকঠাক কাজ হয়েছে যেহেতু এটি trueশেষ হওয়ার আগে ~0.1sকোনও কিছুই হয় না। যাইহোক time source /etc/bash_completionএখানে ~ 0.17 ডলার প্রতিবেদন করে এবং আমার উপস্থিতির জন্য অপেক্ষা করার সময়টি প্রায় এটিই PS1
সিআরস

2
প্রতিভাশালী! ব্যাখ্যায়, ট্র্যাপ কমান্ডগুলি USR1শেষে একটি মিস করে।
ফিশ মনিটর

সিগুএসআর-এর সাহায্যে শেল প্রম্পটে এন্টার চাপ না দেওয়ার আগ পর্যন্ত সিগন্যাল হ্যান্ডলারটি চালিত হয় না। এটি চলার সময় সেই স্থানে একটি বিরতি রয়েছে। আমি সিকিউইটিতে স্যুইচ করেছি এবং এটি ঠিকঠাক কাজ করছে বলে মনে হচ্ছে।
জন ন্যালি

5

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

সর্বশেষতম সংস্করণটি ফ্লাইতে গতি সম্পন্ন সমাপ্তি লোড করে, তাই এটি কমপক্ষে 10x দ্বারা আমার জন্য প্রম্পট লোড সময়কে বিভক্ত করে।


1

সম্পূর্ণকরণগুলি লোড হওয়ার সময় আপনি কোনও স্থানধারক ব্যবহার করতে পারেন; এটি আপনার চোখকে চালিত করার পক্ষে যথেষ্ট হবে। এটি স্পষ্টতই কেবল তখনই কাজ করবে যদি source /etc/bash_completionপ্রথম শেল কমান্ডটি টাইপ করতে এবং জারি করতে আপনার প্রয়োজন সময়ের চেয়ে কম সময় হয়, অন্যথায় এটিও বিলম্বিত হবে will

ধারণাটি হ'ল একটি জাল প্রতিধ্বনি করা PS1, পরিপূরকগুলির উত্স এবং শেষ অবধি টার্মিনালটি সহজ করে দেওয়া।

ধরুন আপনার PS1হয় \u@\h:\w\$, তারা আপনার মত কিছু লিখতে পারেন:

echo -ne "$USER@$HOSTNAME:${PWD/$HOME/\~}\$ "
source /etc/bash_completion
echo -ne '\e[2J\e[H'

কোথায়:

  • 2J টার্মিনাল মুছে;
  • H কার্সারটি উপরের ডান কোণে সরান।

দ্রষ্টব্য: আপনি ব্যবহারকারী রুট কিনা তা যাচাই করতে পারেন এবং ধারাবাহিকতার #পরিবর্তে ব্যবহার করতে পারেন $:

echo -ne "...$([ $UID = 0 ] && echo '#' || echo '$') "

দ্রষ্টব্য: অপসারণটি \e[2Jঝাঁকুনির বিষয়টি এড়িয়ে চলে তবে স্থানধারক যদি প্রকৃত প্রম্পটের চেয়ে দীর্ঘ হয় তবে এটি জাঙ্ক অক্ষরগুলি ছেড়ে যাবে।

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.