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

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

최근 업데이트(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 및 기타 디렉토리를 다시 읽으면 지연이 발생할 수 있습니다.

답변1

문제를 해결하는 방법을 모르겠습니다. 지연을 일으킬 수 있는 모든 종류의 것들이 있습니다. 하지만 조사를 위해 몇 가지 제안을 드릴 수 있습니다.

추측컨데 검색 경로에 있는 디렉터리 중 하나( $PATH또는 bash가 완료 데이터를 찾는 곳)가 응답 속도가 느린 파일 시스템에 있을 수 있습니다. 일반적으로 원격 파일 시스템은 느리지만 하드 드라이브 오류, FUSE 드라이버 정지 등이 원인일 수도 있습니다.

조사의 첫 번째 단계는 set -x셸 실행을 추적하여 완료를 생성하는 명령을 실행하는 것입니다. 어디에서 멈추는지 살펴보세요. 완료되면 추적 끄기를 사용합니다 set +x.

정보가 충분하지 않다면 큰 총을 가져 오십시오. 셸의 프로세스 ID( echo $$)를 기록해 둡니다. 다른 터미널에서 strace -f -s9999 -p$$다음을 실행하십시오.스트레스다른 Unix 버전에서 실행 중인 경우). Strace는 프로세스에서 수행된 시스템 호출을 나열합니다. 액세스해서는 안되는 파일에 액세스하는 것 같은지 또는 특정 파일에 대한 액세스가 느린지 확인하십시오. 명령줄 -T에 옵션을 추가하면 각 시스템 호출에 소요된 시간을 표시할 수 있습니다.strace

답변2

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

지루한 디버그 정보:debug 를 사용하여 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와 같은 작업에는 영향을 미치지 않습니다!!

해결책:아하, 하나 있어요잘못된 제출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 세션에서 로그아웃한 후 다시 로그인해야 합니다.

답변3

나는 당신을 확인하는 것이 좋습니다시스템 오디오잘 작동합니다. 단말기 벨소리가 제대로 재생되지 않아 일시적인 정지 현상이 발생할 수 있습니다. 예: PulseAudio Daemon이 충돌하거나 제대로 작동하지 않습니다.

내 터미널에서 처음으로 Tab 키를 누르면 몇 초 동안 멈춥니다. 그 후에는 괜찮을 거예요. 이는 터미널에서 모든 텍스트를 삭제하고 백스페이스 키를 누른 경우에도 발생합니다.

나는 위의 모든 것을 시도했지만 성공하지 못했습니다.

터미널 벨소리 끄기

Ctrl+ Alt+ T--> 편집 --> 기본 설정 --> {사용자 프로필, 일반적으로 이름이 지정되지 않음} --> 텍스트 --> 소리 --> 선택 취소터미널 벨소리

답변4

또 다른 전략은 Bash 구성 파일을 확인하고 모든 완성 기능을 비활성화하는 것입니다. 그런 다음 더 빠른지 테스트하십시오. 빠르지 않다면 느린(원격) 디스크와 관련이 있을 수 있습니다. 하지만 속도가 더 빠르다면 느린 원인을 찾을 때까지 조금씩 완료를 활성화할 수 있습니다.

나는 /etc/bash.bashrc다음과 같은 부분이 있음을 발견했습니다.

if ! shopt -oq posix; then
  if [ -f /usr/share/bash-completion/bash_completion ]; then
    . /usr/share/bash-completion/bash_completion
  elif [ -f /etc/bash_completion ]; then
    . /etc/bash_completion
  fi
fi

내 지역과 정확히 동일합니다 ~/.bashrc. 따라서 완성코드가 2번 포함되어 모호한 디렉터리 이름을 부분적으로 완성할 때 왠지 속도가 빨라집니다.

관련 정보