최근 업데이트(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번 포함되어 모호한 디렉터리 이름을 부분적으로 완성할 때 왠지 속도가 빨라집니다.