ओएस एक्स पर इतनी धीमी गति से लोड होने के कारण बैश पूरा क्यों हो रहा है?


16

मुझे समझ नहीं आ रहा है कि मेरे मैकबुक प्रो पर बैश की समाप्ति इतनी धीमी क्यों भरी हुई है।

मैंने अपने में निम्नलिखित किया ~/.bash_profile:

echo "Loading BashCompletion..."
if [ -f /opt/local/etc/bash_completion ]; then
    . /opt/local/etc/bash_completion
fi
echo "BashCompletion loaded."

आमतौर पर bash_completion का निष्पादन समय> 2 सेकंड है।

मुझे लगता है कि जब मैं टर्मिनल पर काम कर रहा हूं तो मुझे बहुत गुस्सा आता है जिसके लिए मुझे लगातार नए टैब खोलने की आवश्यकता होती है।

क्या कोई तरीका है जिससे मैं इस या कुछ को कैश कर सकता हूं?

(नोट मैं iTerm2 का उपयोग कर रहा हूं और यह मैक में मूल टर्मिनल पर भी उतना ही धीमा है)।


ऐसा नहीं होना चाहिए। क्या मैं सही हूं कि आप मैकपोर्ट के बैश समापन का उपयोग करें?
15'11

आपके द्वारा लोड की गई फ़ाइल कैसी दिखती है?
डैनियल बेक

@ एसएलएचएचके: हाँ, मैं वास्तव में मैकपोर्ट के बैश पूरा होने का उपयोग कर रहा हूं
गायब हो गया

@ डैनियल: इसके अलावा सब कुछ ठीक है। मैंने लगभग हर लाइन को प्रोफाइल किया।
गायब

5
मैं उसी सुस्ती का अनुभव करता हूं और होमब्रे का उपयोग कर रहा हूं।
ब्रिस

जवाबों:


10

लघु संस्करण: /usr/local/etc/bash_completionदस सेकंड से एक सेकंड के एक चौथाई तक एक नया टैब खोलने के लिए समय को कम करने से एक एकल पंक्ति को हटाना । जानकारी के लिए आगे पढ़ें।

मैं होमब्रे से बैश-समापन का उपयोग कर रहा हूं और उसी समस्या का सामना कर रहा हूं। हर बार जब मैंने एक टर्मिनल खोला, तो बाश पूर्ण स्क्रिप्ट को लोड करने में दस सेकंड से अधिक समय लग रहा था।

उस समय, ऐसा लगता है कि यह have()फ़ंक्शन में एक पंक्ति द्वारा लिया गया है : typeयह निर्धारित करने के लिए कि कमांड लाइन प्रोग्राम स्थापित है या नहीं।

डिफ़ॉल्ट have()फ़ंक्शन और जगह में प्रदान की गई सभी पूरी होने वाली स्क्रिप्ट के साथ, स्क्रिप्ट को लोड करने के लिए 10.561 का समय लगेगा ( मेरी फाइल में लाइन के timeलिए उपसर्ग करके रिपोर्ट किया गया) ।. /opt/local/etc/bash_completion.bash_profile

PATH=$PATH:/sbin:/usr/sbin:/usr/local/sbin type $1 &>/dev/null &&मेरी /usr/local/etc/bash_completionस्क्रिप्ट की लाइन पर टिप्पणी करने के बाद ( लाइन को छोड़कर have=yes, एक नया टर्मिनल खोलने में केवल 0.258s लगते हैं। इस समय को /usr/local/etc/bash_completion.dनिर्देशिका से अनावश्यक पूर्ण स्क्रिप्ट (सिमिलिंक) को हटाकर कम किया जा सकता है ।

मुझे नहीं पता कि कॉल में typeइतनी देर क्यों हो रही है। मैं इसकी जांच कर रहा हूं।

इस दृष्टिकोण के लिए एक संभावित नकारात्मक पक्ष यह है कि यह बैश समापन कार्यों को मेमोरी में लोड करने का कारण बनेगा, भले ही आपके पास उनके लिए कोई उपयोग न हो। have()फ़ंक्शन जांच करता है, तो एक आदेश या आवेदन स्थापित किया गया है देखने के लिए। यदि यह नहीं है, तो पूरी होने वाली स्क्रिप्ट आम तौर पर खुद को लोड करने के लिए परेशान नहीं करने का फैसला करती है क्योंकि इसका कोई फायदा नहीं होगा।

फिलहाल, मैं ट्रेडऑफ से खुश हूं लेकिन typeसमय मिलते ही मैं इस समस्या का पता लगाता रहूंगा । अगर मुझे बेहतर समाधान मिल जाए तो मैं अपना जवाब अपडेट कर दूंगा।


मेरे लिए, इस लाइन पर टिप्पणी करने से 50ms समय कम हो जाता है, 230ms से 180ms तक। निश्चित रूप से मैंने इसे पहली जगह में इतना बुरा कभी नहीं बताया। And
एडवर्ड एंडरसन

यह केवल 60ms के बारे में बताता है, इसलिए मैंने वर्कअराउंड नहीं रखा है। मेरे पास दस सेकंड प्रतीक्षा समय नहीं है, लेकिन 2s के बारे में, जो हल्के से अजीब है।
danemacmillan

7

निष्कर्ष यह है कि MacOS पर नए गोले के लिए स्टार्टअप समय उनके लिए बहुत धीमी गति से कर रहे हैं के लिए आ रहा किसी के लिए, यह है समाधान

मुझे अभी पता चला है कि वास्तव में दो पैकेज हैं, जिनके माध्यम से स्थापित किया जा सकता है brew। मैं bash-completionवर्षों से पैकेज स्थापित कर रहा हूं , और कभी भी इस पर सवाल उठाने की जहमत नहीं उठाई, भले ही उस समय में मैं बैश 3 से 4 तक चला गया हूं, अब 5 तक। समय-समय पर, हालांकि, मैं समस्या पर दोबारा गौर करूंगा। , अक्सर इस StackOverflow चर्चा पर ठोकर खाते हुए।

एक और पैकेज है bash-completion@2,!

क्या फर्क पड़ता है? bash-completionबैश संस्करण 3.2 के लिए है। bash-completion@2बैश संस्करण 4.1+ और 5 के लिए है।

पुराने bash-completionपैकेज को हटाने , और स्थापित करने में bash-completion@2, मेरा शेल स्टार्टअप समय 605ms से 244ms पर गिर गया है। यह एक बड़ी गति में सुधार है।

मुझे संदेह है कि हम में से बहुत से लोग यह गलती कर रहे हैं, क्योंकि brew infoआंकड़े बताते हैं कि पूर्व में टन स्थापित है, जबकि बाद में बहुत कम है:

यहाँ छवि विवरण दर्ज करें

यह ध्यान दिया जाना चाहिए कि वर्तमान चुने गए उत्तर में कुछ पंक्तियों का उल्लेख किया गया है, जो केवल स्टार्टअप समय (यदि पुराने bash-completionपैकेज का उपयोग करते हुए , जो कि शायद बहुत से हैं) का मामूली सुधार प्रदान करता है , लेकिन नए bash-completion@2पैकेज पर कोई प्रभाव नहीं पड़ता है : यह नया पैकेज तेजी से कोई बात नहीं क्या है इसका मतलब है कि कोई हैक की आवश्यकता नहीं है।

टी एल; डॉ:

brew uninstall bash-completion && brew install bash-completion@2

याद रखें कि अपने .bashrcया .bash_profileफ़ाइल में स्रोत पथ को पूरा करने के लिए अद्यतन करें ।

सूत्रों का कहना है:


एक विषय के रूप में कुछ हद तक संबंधित है, मैं rcloneउपयोगिता का बहुत उपयोग करता हूं , इसलिए यह स्थापित है। यह मेरे द्वारा देखी गई सबसे बड़ी पूर्ण फ़ाइल होने के लिए भी होता है । इसे हटाने से मेरे शेल स्टार्टअप का समय ~ 120ms कम हो जाता है, जो बहुत तेज़ है।


संपादित करें:

जो कोई भी तकनीकी विवरण चाहता है, जो इस समस्या की व्याख्या करता है, मैंने इसके बारे में Homebrew मंचों पर लंबाई में लिखा है । संक्षेप में, कारण यह bash-completion@2है कि इतनी तेज है क्योंकि यह लिखा गया था ताकि यह अब सभी पूर्ण फ़ाइलों को उत्सुकता से लोड न करे ; इसके बजाय यह एक पूर्ण फ़ाइल ऑन-डिमांड को लोड करता है, या जैसा कि लेखक इसका वर्णन करता है, यह उन्हें गैर-उत्सुक तरीके से लोड करता है।


मुझे लगता है कि macOS पर डिफ़ॉल्ट बैश संस्करण अभी भी v3.2 है - मुझे नहीं लगता कि यह बैश v4.2 के साथ जहाज है। क्या आपके पास एक संदर्भ है जहां यह कहता है कि बैश v4.2 + के साथ macOS जहाज?
nwinkler

1
@nwinkler आप सही होंगे। मैं हैरान हूं कि मैं ऐसा क्यों हुआ, क्योंकि मैकओएस अभी भी जहाजों के साथ है version 3.2.57(1)-release (x86_64-apple-darwin18)। यह बात बताने के लिए धन्यवाद; मैंने अपने पोस्ट से लाइन हटा दी है।
डेनामेक्लामिलन

1
चौंकाने वाला, मुझे पता है ... आपके उत्तर को अपडेट करने के लिए धन्यवाद!
nwinkler

3

इस विचार के साथ कि गॉडबाइक ने मुझे जवाब दिया, मैंने पाया कि मेरे पैथ चर में कुछ निर्देशिकाएं थीं जिनके पास कोई बायनेरी नहीं था या मौजूद नहीं था, उन्हें हटाकर इसे काफी बढ़ा दिया। दूसरे शब्दों में, यह वह पाथ है जो मैंने अपने बैशके में किया था:

PATH="$GOPATH/bin:/some/directory/not/existing:/some/empty/directory:/some/directory/without/binaries:$PATH"

और फिर मैंने इसे बदल दिया:

PATH="$GOPATH/bin:$PATH"

ऐसा इसलिए था क्योंकि haveउस बैश पूरा होने में कार्य, प्रत्येक कमांड के लिए देखा गया था, और मेरे पास बहुत सारे बेकार निर्देशिकाएं थीं जो उन प्रत्येक बायनेरिज़ के लिए देखी जाने वाली थीं, उन्हें हटाकर इसे अलग कर दिया।


मैंने अपने पाथ पर्यावरण चर से मौजूद रास्तों को हटाकर लोड समय को लगभग 5 सेकंड से 1 सेकंड से भी कम समय में बदलने में कामयाब रहा।
ज्यूरिजन १19

0

मेरी भी यही समस्या थी। कुछ सरल डिबगिंग चाल मुझे मूल कारण के लिए मिला।

पहले, सक्षम करें DEBUG modeताकि आप देख सकें कि क्या हो रहा है:

export BASH_COMPLETION_DEBUG=true

यह कंसोल पर वर्बोज़ प्रिंटिंग को सक्षम करता है, जिससे आप अंतिम कमांड देख सकते हैं। अब आप पृष्ठभूमि में स्क्रिप्ट निष्पादित कर सकते हैं और आप देखेंगे कि क्या हो रहा है

. /opt/local/etc/bash_completion &

ऐसा न करें PID, जिसे आप तब psया उसके साथ ट्रेस कर सकते हैं pstree:

pstree -p <the PID>:

| |     \-+= 82095 mfellows -bash
| |       \-+- 82103 mfellows -bash
| |         |-+- 82104 mfellows cargo --list
| |         | \--- 82106 mfellows rustc -vV --cap-lints allow

जैसा कि आप देख सकते हैं, इसने जंग से संबंधित कुछ कमांड शुरू किए, जो उम्र ले रहे थे।

अस्थायी रूप से /opt/boxen/homebrew/etc/bash_completion.d/cargoमेरे लक्षणों को दूर करना।


-1

यदि आप MacPorts> = 2.1.2 और माउंटेन लायन चला रहे हैं तो ऐसा लगता है कि यह bash_profileगलत है। मैक ओएस एक्स पर काम करने के लिए git-complete.bash कैसे प्राप्त करें पर निर्देशों का पालन करें ? । मुझे लगता है कि ऑटो-पूर्ति को गति दे सकता है।

एक अन्य उपाय यह होगा कि फ़िंक या होमब्रे के माध्यम से ऑटो-पूर्ण स्थापित करने का प्रयास किया जाए । यदि वह काम नहीं करता है, तो आप पूरी तरह से एक और शेल की कोशिश कर सकते हैं। मैंने पाया है कि ऑटो-पूरा होने (बॉक्स से बाहर) आने पर फिश शेल बकाया है। हालाँकि संस्करण 2 अभी भी बीटा में है लेकिन मैं इसकी अत्यधिक अनुशंसा करूँगा।


-1

मैं यह अनुमान लगाने जा रहा हूं कि आपका बैश बहुत पुराना है। मैं स्टॉक बैश चला रहा हूं जो माउंटेन लायन के साथ आया था और यहां मैं देख रहा हूं:

$ port info bash-completion
bash-completion @2.0, Revision 1 (sysutils)

Description:          Programmable completion library for bash. This port
                      **requires bash >=4.1** and is meant to be used together with
                      the bash port.
Homepage:             http://bash-completion.alioth.debian.org/

Runtime Dependencies: bash
Conflicts with:       bash-completion-devel
Platforms:            darwin
License:              GPL-2+
Maintainers:          raimue@macports.org

$ bash --version
GNU bash, version **3.2.48(1)-release (x86_64-apple-darwin12)**
Copyright (C) 2007 Free Software Foundation, Inc.

मुझे यह पोर्ट कमांड नहीं दिख रहा है। :( मुझे कैसे पता चलेगा कि मेरे टैब पर कौन सा git टैब पूरा करने वाला सॉफ्टवेयर चल रहा है।
डीन हिलर

@DeanHiller यह उत्तर मैकपोर्ट्स पैकेज मैनेजर की बात कर रहा है, जो पोर्ट कमांड प्रदान करता है। Macports का बैश पूरा करने वाला ऐप OS X के साथ दिए गए नए से नया होगा।
मैट S
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.