bash에서 느린 자동 완성을 디버깅하고 수정하는 방법은 무엇입니까?


26

최근 업데이트 (Ubuntu 12.04 LTS) 후 명령 줄에서 TAB 완료가 느립니다. 부분 명령 (예 :) evi [TAB]또는 부분 파일 이름 (예 :)을 입력 한 후 evince somedocu[TAB]쉘이 항상 그런 것은 아니지만 때때로 몇 초 동안 정지됩니다.

개인적으로, 나는 느린 자동 완성보다 덜 강력한 자동 완성을 선호합니다. 간단한 수정이 있습니까?

편집 : 주석 관련 추가 정보 :

  • PATH는 꽤 표준입니다. ~ / bin에는 bash 스크립트가 있습니다.

    $ echo $PATH
    /home/USERNAME/bin:/usr/local/bin:/usr/bin:/bin:/usr/games
  • 작업 디렉토리의 파일 수는 100보다 작습니다.

  • 자동 완성 기능은 비정상적인 디스크 작업 (시스템 업그레이드) 후 특히 느려졌습니다. 따라서 / usr / bin 및 기타 디렉토리를 다시 읽으면 지연이 발생했을 수 있습니다.

4
업데이트로 하드 드라이브 속도 관리를 활성화하고 자동 완성이 자동 완성을 계산할 수 있도록 디스크가 깨어날 때까지 기다리지 않습니까?
Vincent Nivoliers

2
현재 디렉토리에있는 파일 수에 따라 달라 집니까?
terdon

1
# echo $ PATH는 무엇을 말합니까? 경로의 디렉토리에 많은 파일 (수만 개 이상)이 있으면 그 원인 일 수 있습니다.
Stephan

답변:


28

나는 고치는 것에 대해 모른다. 지연을 일으킬 수있는 모든 종류의 것들이있다. 그러나 조사 할 몇 가지 팁을 제공 할 수 있습니다.

추측처럼, 검색 경로 어딘가에 디렉토리가 $PATH있거나 ( bash는 완성 데이터를 찾는 곳) 응답이 느린 파일 시스템에 있습니다. 일반적으로 원격 파일 시스템은 느리지 만 하드 디스크 고장, 정지 된 퓨즈 드라이버 등일 수도 있습니다.

조사 할 첫 번째 단계 set -x는 완료를 생성하기 위해 쉘이 실행하는 명령의 추적을 얻기 위해 실행 하는 것입니다. 어디서 멈추는 지보십시오.

정보가 충분하지 않으면 큰 총을 가져 오십시오. 쉘의 프로세스 ID ( echo $$)를 기록하십시오. 다른 터미널에서 실행하십시오 strace -f -s9999 -p$$(또는 다른 유닉스 변종에서 실행하는 경우 strace 와 동일 ). Strace는 프로세스가 수행 한 시스템 호출을 나열합니다. 파일에 액세스하지 않아야하는 파일인지 또는 일부 파일에 대한 액세스 속도가 느린 지 확인하십시오. 명령 행에 옵션 -T을 추가하면 strace각 시스템 호출에 소요 된 시간이 표시됩니다.


1
내가 유닉스를 사용하고 있었고 몰랐던 시간 set -x, 얼마나 멋진 명령인지. 매우 "해커 모드 참여"
Matt Fletcher

6
시는 사용이 set +x정상이 아닌 디버그 모드로 돌아갑니다
매트 플레처

19

* nix 박스가 LDAP 클라이언트로 설정된 경우 로컬 사용자로 로그인 한 경우에도이 문제가 발생할 수 있습니다.

지루한 디버그 정보 :로 디버깅 set-x중 완료된 항목을 발견했습니다.

> set -x
> ls foo<tab>
...                     <--- lots of output removed
...
+ _quote_readline_by_ref foo quoted
+ '[' -z foo ']'
+ [[ foo == \'* ]]      <--- froze here
+ [[ foo == ~* ]]       <--- actually causing the trouble

확인 : 나는 이것 ls ~*또한 매달렸다는 것을 확인했다 . 내 LDAP 서버가 느리다는 것이 밝혀졌지만 이것은 bash 완료 및 ls와 같은 것에 영향을 미치지 않아야합니다!

솔루션 : Aha, bash-completion + ldap에 대해 버그가 제기 되어 최신 버전으로 수정되며 대기하지 않으려면 간단한 패치가 적용 됩니다. 다시 한 번 탭 완성이 빠릅니다.

링크가 사라지는 경우를 대비 한 패치 파일입니다. 545 줄과 547 줄에서 ~를 이스케이프하는 것입니다.

--- /usr/share/bash-completion/bash_completion.orig 2014-11-06 10:36:14.981888369 +0100
+++ /usr/share/bash-completion/bash_completion  2014-11-06 10:36:25.142070963 +0100
@@ -542,9 +542,9 @@
     elif [[ $1 == \'* ]]; then
         # Leave out first character
         printf -v $2 %s "${1:1}"
-    elif [[ $1 == ~* ]]; then
+    elif [[ $1 == \~* ]]; then
         # avoid escaping first ~
-        printf -v $2 ~%q "${1:1}"
+        printf -v $2 \~%q "${1:1}"
     else
         printf -v $2 %q "$1"
     fi

이 패치를 적용하려면 현재 ssh 세션을 종료하고 다시 로그인해야합니다.


1
나는이 정확한 문제가 있었다 패치가 좋다
radman

2
2 3 년 전과 동일한 문제 (Debian 8.5)와 솔루션은 매력처럼 작동합니다. 데비안 8.6에는 문제가 없습니다.
YoMismo

2
나는 백만 번 -xa 사용 설정을했습니다 아직 나는 예상하지 많은 감사를 완료 성능 문제를 보여!
MarcH

데비안 9.8에서이 문제가 발생했습니다!
Philippe Gachoud

0

bash-completion을 다시 설치하십시오.

sudo apt-get install --reinstall bash-completion

나를 위해 이것은 Ubuntu 18.04.3 LTS에서 수정되었습니다.


0

또한 어떤 사람들은 Git bash 자동 완성 과 같은 추가 자동 완성 기능을 사용 합니다. 배시 완료 속도 저하는 추가 자동 완성 기능이 잘못 작동하여 발생할 수 있습니다.

내 경우에는 Git bash auto complete git 공개 키가 업데이트되었으므로 인증 시도가 실패하여 중단이 발생했습니다. 자동 완성 기능을 제거하면 다시 빠릅니다. 그래서 내 솔루션은 내 키를 수정하고 다시 활성화하는 것이 었습니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.