OS X에서 bash 완료가 너무 느리게로드되는 이유는 무엇입니까?


16

MacBook Pro에서 bash 완료가 너무 느리게로드되는 이유를 모르겠습니다.

나는 내에서 다음을 수행했습니다 ~/.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를 사용하고 있으며 Mac의 원래 터미널에서도 속도가 느립니다.)


그런 일은 일어나지 않아야합니다. MacPort의 bash 완성을 사용하는 것이 맞습니까?
slhck

로드 한 파일은 어떤 모양입니까?
Daniel Beck

@slhck : 그래, 난 참 macport의 bash는 완성 사용하고
disappearedng

@ 다니엘 : 이것을 제외한 모든 것이 괜찮습니다. 거의 모든 라인을 프로파일 링했습니다.
goneedng

5
나는 같은 속도가 느리고 Homebrew를 사용하고 있습니다.
Brice

답변:


10

짧은 버전 : 한 줄을 제거하면 /usr/local/etc/bash_completion새 탭을 여는 시간이 10 초에서 1/4 초로 단축되었습니다. 자세한 내용은 계속 읽으십시오.

homebrew에서 bash-completion을 사용하고 있으며 동일한 문제가 발생했습니다. 터미널을 열 때마다 bash 완료 스크립트를로드하는 데 10 초 이상이 걸렸습니다.

대부분의 경우, 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디렉토리 에서 불필요한 완료 스크립트 (symlink)를 제거하여 더 줄일 수 있습니다 .

왜 전화 type가 오래 걸 렸는지 모르겠습니다 . 나는 다음에 그것을 조사하고 있습니다.

이 접근 방식의 한 가지 단점은 bash 완료 함수를 사용하지 않아도 메모리에로드되는 것입니다. 이 have()기능은 명령 또는 응용 프로그램이 설치되어 있는지 확인합니다. 그렇지 않은 경우 완료 스크립트는 일반적으로 사용하지 않기 때문에 자체로드를 방해하지 않기로 결정합니다.

현재는 장단점에 만족하지만 type시간이 지남에 따라 문제를 계속 탐색 할 것 입니다. 더 나은 솔루션을 찾으면 답변을 업데이트하겠습니다.


저 에게이 줄을 주석 처리하면 시간이 230ms에서 180ms로 50ms 단축됩니다. 물론 처음에는 그렇게 나쁘지 않았습니다. 👍
Edward Anderson

이것은 약 60ms 만 면도했기 때문에 해결 방법을 유지하지 않았습니다. 대기 시간은 10 초가 아니지만 약 2 초이며, 이는 약간 짜증납니다.
danemacmillan

7

MacOS에서 새로운 쉘의 시작 시간이 너무 느리다는 결론을 내린 사람 이것이 해결책 입니다.

방금를 통해 설치할 수있는 두 개의 패키지가 있다는 것을 알았습니다 brew. 나는 bash-completion몇 년 동안 패키지를 설치 해 왔으며 그 당시에는 Bash 3에서 4로, 지금 5로 갔지만 그 질문에 귀를 기울이지 않았습니다. 이 StackOverflow 토론에 종종 걸림돌이됩니다.

또 다른 패키지가 있습니다 bash-completion@2!

차이점이 뭐야? bash-completionBash 버전 3.2 용입니다. bash-completion@2Bash 버전 4.1 이상이며 5입니다.

이전 bash-completion패키지를 제거 하고 설치 bash-completion@2하면 쉘 시작 시간이 605ms에서 244ms로 줄었습니다. 그것은 엄청난 속도 향상입니다.

는 AS 나는, 우리 중 많은 사람들이 같은 실수를하고있다 의심 brew info통계 후자는 그렇게 몇있는 동안 전자는 설치,의 톤을 가지고 있음을 보여

여기에 이미지 설명을 입력하십시오

주목해야한다 현재 선택된 답변 (이전 사용하는 경우 시간을 시동 단지 약간의 향상을 제공 몇 줄을 주석 언급 bash-completion많은 사람들이 아마 패키지를,)하지만 새에 어떠한 영향이없는 bash-completion@2패키지를이 새로운 패키지를 어쨌든 빠릅니다. 즉, 해킹이 필요하지 않습니다.

TL; DR :

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

.bashrc또는 .bash_profile파일 에서 완료 파일의 소스 경로를 업데이트해야 합니다.

출처 :


다소 관련된 주제로 rclone유틸리티를 많이 사용 하므로 설치됩니다. 또한 내가 본 것 중 가장 큰 완성 파일 을 가지고 있습니다 . 제거하면 쉘 시작 시간이 ~ 120ms로 단축되는데, 이는 매우 빠릅니다.


편집하다:

이 문제를 설명하는 기술적 인 세부 사항을 원하는 사람 은 Homebrew 포럼에 그 내용을 자세히 작성했습니다 . 요약하자면, bash-completion@2훨씬 더 빠른 이유 는 더 이상 모든 완료 파일을 열심히 로드 하지 않도록 작성 되었기 때문입니다 . 대신 요청시 완료 파일을로드하거나 작성자가 설명하는대로 열성적이지 않은 방식으로 로드합니다 .


macOS의 기본 Bash 버전은 여전히 ​​v3.2라고 생각합니다. Bash v4.2와 함께 제공되는 것은 아닙니다. macOS가 Bash v4.2 이상과 함께 제공된다는 참조 자료가 있습니까?
nwinkler

1
@nwinkler 당신은 맞을 것입니다. MacOS가 여전히와 함께 제공되기 때문에 내가 왜 언급했는지 의아해 version 3.2.57(1)-release (x86_64-apple-darwin18)합니다. 지적 해 주셔서 감사합니다. 게시물에서 줄을 삭제했습니다.
danemacmillan

1
배플 링, 알아요 ... 답변을 업데이트 해 주셔서 감사합니다!
nwinkler

3

godbyk 응답이 나에게 주었다는 생각으로 PATH 변수에 바이너리가 없거나 존재하지 않는 몇 개의 디렉토리가있어서 제거했습니다. 다시 말해, 이것은 내 bashrc에있는 PATH입니다.

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

그리고 나는 그것을 다음과 같이 바꿨다.

PATH="$GOPATH/bin:$PATH"

이것은 havebash 완료의 기능 이 각 명령을 찾았 기 때문에 각 바이너리에 대해 방문 할 쓸모없는 디렉토리가 너무 많아서 제거했습니다.


또한 PATH 환경 변수에 존재하지 않는 경로를 제거하여로드 시간을 약 5 초에서 1 초 미만으로 변경했습니다.
juriejan

0

나는 같은 문제가 있었다. 몇 가지 간단한 디버깅 요령으로 인해 근본 원인이 생겼습니다.

먼저, DEBUG mode무슨 일이 일어나고 있는지 볼 수 있도록 활성화 하십시오.

export BASH_COMPLETION_DEBUG=true

이렇게하면 콘솔에 상세하게 인쇄 할 수 있으므로 마지막 명령을 볼 수 있습니다. 이제 백그라운드에서 스크립트를 실행할 수 있으며 무슨 일이 일어나고 있는지 볼 수 있습니다

. /opt/local/etc/bash_completion &

를 사용하지 않으면 또는 PID로 추적 할 수 있습니다 .pspstree

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 및 Mountain Lion을 실행하고 있다면 bash_profile잘못된 것 같습니다 . Mac OS X에서 git-completion.bash를 작동 시키는 방법에 대한 지침을 따르십시오 . . 자동 완성 속도를 높일 수 있다고 가정합니다.

또 다른 해결책은 Fink 또는 Homebrew 를 통해 자동 완성 설치를 시도하는 것 입니다. 그래도 작동하지 않으면 다른 쉘을 모두 사용해 볼 수 있습니다. 피쉬 쉘 은 자동 완성 (즉시 사용 가능)과 관련하여 탁월한 것으로 나타났습니다 . 버전 2는 아직 베타 버전이지만 권장합니다.


-1

네 배쉬가 너무 오래된 것 같아. Mountain Lion과 함께 제공되는 재고 bash를 실행 중이며 다음과 같습니다.

$ 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 tab 완성 소프트웨어가 실행되고 있는지 어떻게 알 수 있습니까?
Dean Hiller

@DeanHiller이 답변은 포트 명령을 제공하는 Macports 패키지 관리자를 나타냅니다. Macports의 bash 완성 앱은 OS X에서 제공되는 것보다 최신 버전입니다.
Matt S
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.