ทำไมการโหลด bash เสร็จสิ้นจึงช้าใน OS X


13

ฉันไม่เข้าใจว่าทำไมการโหลด bash เสร็จจึงช้าลงบน MacBook Pro ของฉัน

ฉันทำสิ่งต่อไปนี้ในของฉัน ~/.bash_profile:

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

เวลาดำเนินการสำหรับ bash_completion โดยทั่วไปคือ & gt; 2 วินาที

ฉันพบว่ามันน่ารำคาญจริง ๆ เมื่อฉันทำงานบนเครื่องเทอร์มินัลซึ่งทำให้ฉันต้องเปิดแท็บใหม่ ๆ

มีวิธีที่ฉันสามารถแคชนี้หรืออะไรบางอย่าง?

(หมายเหตุฉันใช้ iTerm2 และนี่ก็ช้าเหมือนกันกับเทอร์มินัลดั้งเดิมใน Mac เช่นกัน)


ที่ไม่ควรเกิดขึ้น ฉันแก้ไขคุณใช้การทุบตีของ MacPort เสร็จหรือ
slhck

ไฟล์ที่คุณโหลดมีลักษณะอย่างไร
Daniel Beck

@slhck: ใช่ฉันใช้ bash สมบูรณ์ของ macport
disappearedng

@Daniel: ทุกอย่างเรียบร้อยยกเว้นเรื่องนี้ ฉันทำประวัติเกือบทุกบรรทัด
disappearedng

5
ฉันมีความเชื่องช้าเหมือนกันและฉันใช้ Homebrew
Brice

คำตอบ:


7

เวอร์ชั่นย่อ: การลบบรรทัดเดียวออก /usr/local/etc/bash_completion ลดเวลาในการเปิดแท็บใหม่จากสิบวินาทีถึงหนึ่งในสี่ของวินาที อ่านต่อเพื่อดูรายละเอียด

ฉันกำลังใช้ bash-completion จาก homebrew และพบปัญหาเดียวกัน ใช้เวลาเกินสิบวินาทีในการโหลดสคริปต์เสร็จสิ้นการทุบตีทุกครั้งที่ฉันเปิดเทอร์มินัล

เวลาส่วนใหญ่ดูเหมือนว่าจะถูกยึดครองโดยบรรทัดเดียวใน have() ฟังก์ชั่น: โทรไป type เพื่อตรวจสอบว่ามีการติดตั้งโปรแกรมบรรทัดคำสั่ง

ด้วยค่าเริ่มต้น have() ฟังก์ชั่นและสคริปต์การเติมเต็ม bash ที่เตรียมไว้ให้เสร็จสมบูรณ์จะใช้เวลา 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.258 วินาที เวลานี้สามารถลดลงได้อีกโดยลบสคริปต์การทำให้สมบูรณ์ที่ไม่จำเป็น /usr/local/etc/bash_completion.d ไดเรกทอรี

ฉันไม่รู้ว่าทำไมสายถึง type ใช้เวลานานมาก ฉันกำลังตรวจสอบว่าต่อไป

ข้อเสียที่เป็นไปได้อย่างหนึ่งของวิธีนี้คือมันจะทำให้ฟังก์ชั่นเติมเต็มของ bash เสร็จสิ้นลงในหน่วยความจำแม้ว่าคุณจะไม่ใช้มัน have() ฟังก์ชั่นการตรวจสอบเพื่อดูว่าคำสั่งหรือโปรแกรมที่ติดตั้ง หากไม่เป็นเช่นนั้นสคริปต์การเสร็จสิ้นโดยทั่วไปจะไม่รบกวนการโหลดตัวเองเพราะจะไม่มีประโยชน์

ในตอนนี้ฉันมีความสุขกับการแลกเปลี่ยน แต่ฉันจะสำรวจต่อไป type ปัญหาตามที่ฉันได้รับเวลา ฉันจะอัปเดตคำตอบของฉันหากฉันพบทางออกที่ดีกว่า


สำหรับฉันการแสดงความคิดเห็นในบรรทัดนี้จะลดเวลา 50ms จาก 230ms เป็น 180ms แน่นอนฉันไม่เคยแย่ขนาดนั้นมาก่อนเลย
Edward Anderson

เพียงโกนออกไปประมาณ 60ms ดังนั้นฉันจึงไม่ได้แก้ปัญหา ฉันไม่มีเวลารอสิบวินาที แต่ประมาณ 2 วินาทีซึ่งค่อนข้างน่ารำคาญ
danemacmillan

2

ด้วยความคิดที่คำตอบ godbyk ให้ฉันฉันพบว่าตัวแปร PATH ของฉันมีบางไดเรกทอรีที่ไม่มีไบนารีหรือไม่มีอยู่ลบพวกเขาเร่งมันขึ้นอย่างมาก กล่าวอีกนัยหนึ่งนี่คือเส้นทางที่ฉันมีใน bashrc ของฉัน:

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

จากนั้นฉันเปลี่ยนเป็น:

PATH="$GOPATH/bin:$PATH"

นี่เป็นเพราะ have ฟังก์ชั่นในการทุบตีเสร็จสิ้นค้นหาคำสั่งแต่ละคำสั่งและฉันมีไดเรกทอรีที่ไร้ประโยชน์มากเกินไปที่จะถูกเยี่ยมชมสำหรับแต่ละไบนารีเหล่านั้น


ฉันจัดการเพื่อเปลี่ยนความเร็วในการโหลดจากประมาณ 5 วินาทีเป็นน้อยกว่า 1 วินาทีด้วยการลบเส้นทางที่ไม่มีอยู่ในตัวแปรสภาพแวดล้อม PATH ของฉัน
juriejan

1

สำหรับทุกคนที่มาถึงข้อสรุปว่าเวลาเริ่มต้นสำหรับเชลล์ใหม่บน MacOS ช้าเกินไปสำหรับพวกเขา นี่คือ สารละลาย .

ฉันเพิ่งค้นพบว่ามีอยู่จริง สอง แพ็คเกจที่สามารถติดตั้งผ่าน brew. ฉันติดตั้งแล้ว bash-completion แพคเกจสำหรับปีและไม่เคยใส่ใจที่จะถามมันแม้ว่าในเวลานั้นฉันได้ไปจาก Bash 3 เป็น 4 ถึง 5 ตอนนี้แม้ว่าฉันจะทบทวนปัญหามักจะสะดุดกับสิ่งนี้มาก การอภิปราย StackOverflow

มีแพ็คเกจอื่น bash-completion@2!

ความแตกต่างคืออะไร? bash-completion ใช้สำหรับ Bash เวอร์ชัน 3.2 bash-completion@2 ใช้สำหรับ Bash เวอร์ชัน 4.1+ และ 5 MacOS นั้นได้จัดส่งพร้อมกับ Bash & gt; 4.1 มาระยะหนึ่ง

ในการถอดแบบเก่า bash-completion แพคเกจและการติดตั้ง bash-completion@2เวลาเริ่มต้นเชลล์ของฉันลดลงจาก 605ms เป็น 244ms นั่นเป็นการปรับปรุงความเร็วอย่างมาก

ฉันสงสัยว่าพวกเราหลายคนกำลังทำผิดพลาดนี้เช่นเดียวกับ brew info สถิติแสดงให้เห็นว่าอดีตมีการติดตั้งจำนวนมากในขณะที่รุ่นหลังมีจำนวนน้อย:

enter image description here

ควรสังเกตว่า คำตอบที่เลือกในปัจจุบัน กล่าวถึงการแสดงความคิดเห็นบางบรรทัดซึ่งมีการปรับปรุงเพียงเล็กน้อยเพื่อเวลาเริ่มต้น (ถ้าใช้เก่า bash-completion แพคเกจซึ่งหลายคนอาจจะ) แต่ไม่มีผลกระทบใด ๆ กับใหม่ bash-completion@2 package: แพ็คเกจใหม่นี้เร็วไม่ว่าอะไรจะเกิดขึ้น นั่นหมายความว่าไม่จำเป็นต้องแฮ็ก

TL; DR:

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

อย่าลืมอัปเดตพา ธ ต้นทางไปยังไฟล์เสร็จใน .bashrc หรือ .bash_profile ไฟล์.

แหล่งที่มา:


เป็นหัวข้อที่ค่อนข้างเกี่ยวข้องฉันใช้ rclone ยูทิลิตี้มากดังนั้นจึงติดตั้ง มันก็เกิดขึ้นได้ ไฟล์ความสมบูรณ์ที่ใหญ่ที่สุดที่ฉันเคยเห็น . การลบมันลดเวลาการเริ่มต้นเชลล์ของฉันเป็น ~ 120ms ซึ่งเร็วมาก


แก้ไข:

สำหรับใครก็ตามที่ต้องการรายละเอียดทางเทคนิคที่อธิบายถึงปัญหานี้ฉันเอง เขียนเกี่ยวกับเรื่องนี้ในฟอรัม Homebrew . เพื่อสรุปเหตุผลที่ bash-completion@2 มันเร็วกว่ามากเพราะมันถูกเขียนขึ้นเพื่อไม่ให้นานขึ้น กระหาย โหลดไฟล์ที่เสร็จสมบูรณ์ทั้งหมด; แทนมันจะโหลดไฟล์เสร็จตามความต้องการหรือตามที่ผู้เขียนอธิบายมันมันโหลดใน ไม่ใช่ความกระตือรือร้น ลักษณะ.


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 & gt; = 2.1.2 และ Mountain Lion ดูเหมือนว่าของคุณ bash_profile มันผิด. ทำตามคำแนะนำใน วิธีการรับ git-completion.bash เพื่อทำงานบน Mac OS X . ฉันคิดว่าสามารถเพิ่มความเร็วในการทำให้สมบูรณ์อัตโนมัติ

วิธีแก้ไขปัญหาอื่นคือลองติดตั้งการทำให้สมบูรณ์อัตโนมัติผ่าน ตำรวจ หรือ Homebrew หากวิธีนี้ใช้ไม่ได้ผลคุณสามารถลองเชลล์อื่นโดยสิ้นเชิง ฉันพบว่า ปลาเปลือกหอย โดดเด่นเมื่อมันมาถึงการเติมอัตโนมัติ (ออกจากกล่อง) แม้ว่าเวอร์ชั่น 2 จะยังอยู่ในช่วงเบต้า แต่ฉันขอแนะนำเป็นอย่างยิ่ง


-1

ฉันจะเดาว่า bash ของคุณเก่าเกินไป ฉันกำลังทุบตีหุ้นที่มาพร้อมกับ Mountain Lion และนี่คือสิ่งที่ฉันเห็น:

$ 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 ใดกำลังทำงานอยู่บน mac ของฉัน
Dean Hiller

@DeanHiller คำตอบนี้อ้างถึงตัวจัดการแพคเกจ Macports ซึ่งให้คำสั่งพอร์ต แอปทุบตีของ Macports จะใหม่กว่าแอพที่จัดมาให้พร้อมกับ OS X
Matt S
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.