Ubuntu 20.04 Shell - TAB을 누르면 이상한 "자동 완성 출력"이 표시됩니다.

Ubuntu 20.04 Shell - TAB을 누르면 이상한 "자동 완성 출력"이 표시됩니다.

이상한 문제가 있는데 StackExchange에서 비슷한 질문을 검색하는 방법을 잘 모르겠습니다.

이는 와 관련이 있습니다 Ubuntu 20.04 command-line.

키를 누르면 TABAutoComplete는 "현재 명령에 대한 입력"의 일부로 매우 이상한 결과를 추가합니다.

예를 들어:

Typing: (cd and pressing TAB afterwards)
....
cd words=("${@:3:2}")
cword="$3"
cur="$3"
cur="$3"
cword="$3"
prev="$3"
words=("${@:3:2}")
stage^C

타이핑할 때도 마찬가지bash + TAB

bash words=("${@:3:2}")
cword="$3"
cur="$3"
cur="$3"
cword="$3"
prev="$3"
words=("${@:3:2}")
^C

최근 쉘 자동 완성 기능이 이상하게 작동하고 있는데 어떻게 해결해야 할지 모르겠습니다. (다시 한번 사과드립니다. 저는 이 질문을 적절하게 표현하는 방법을 모르고 비슷한 질문도 찾을 수 없습니다.)

노트:

reset콘솔만 지웠는데 그 후에도 문제가 지속됩니다!

답변1

나는 당신의 쉘이 Bash라고 가정합니다. eval다음과 같이 재정의하여 문제를 재현 할 수 있습니다 .

eval() { echo "$1"; }

또는 유사합니다. 완료 기능이 사용 됩니다 eval.evaleval 이것케이스 내장. eval조작 하면 오작동할 수 있습니다.

내 테스트에 따르면 eval별칭이나 실행 파일이 되어도 완료가 중단되지 않으므로 귀하의 경우 함수일 가능성이 높습니다.

옮기다

type eval

일반적으로 출력은 다음과 같아야 합니다 eval is a shell builtin.eval is a function

unset -f eval

완료가 더 잘 수행되는지(또는 적어도 다르게) 확인합니다.

이 기능이 어디서 왔는지 조사해야 합니다. 수동 방법은 시작 파일(~/.bashrc 등.) 그리고 그들이 구매하는 모든 것. 더 좋은 방법이 있습니다. 다음과 같이 진행하세요:

shopt -s extdebug   # enable extra debugging info
declare -F eval

그러면 줄 번호와 소스 파일이 표시됩니다. ( shopt -u extdebug디버깅을 비활성화하려면 마지막으로 실행하십시오.)

위의 방법은 함수 정의를 찾는 데 충분해야 합니다. 만일을 대비하여 다음과 같은 다른 방법이 있습니다.Bash 기능을 정의하는 파일을 찾는 방법.

함수의 정의를 찾으면 이를 삭제하고 내장 함수 eval로 만듭니다 . eval노트:

  • 정의를 제거해도 이미 실행 중인 셸은 자동으로 복구되지 않습니다. 새 쉘을 생성하고 의심스러우면 로그인하십시오.
  • 정의를 제거하면 실제로 함수가 필요한 모든 것이 중단되므로 추가 조사가 필요할 수 있습니다. 함수가 존재하는 이유는 무엇입니까? 정의의 코드를 확장할 수 없는 경우에는 삭제(적어도 처음에는 일시적으로)보다는 이름을 바꾸는 것이 좋습니다.
  • 함수는 여러 번 정의할 수 있습니다(가장 가까운 소스의 정의가 우선합니다). 정의를 삭제해도 내장 기능이 복원되지 않으면 정의가 남아 있을 수 있습니다. 방법을 반복하십시오.

완료가 완전히 수정되지 않은 경우 출력을 확인 declare -F하고 내장 기능을 대체하는 다른 기능이 있는지 확인하십시오(사용compgen -b무엇을 검색해야 하는지 알 수 있습니다). 필요한 경우 방금 수행한 대로 분석하고 eval유사한 수리를 수행합니다.

답변2

공백을 놓쳐 set -o vi입력했을 때 이런 일이 일어났습니다 set -ovi. 이로 인해 bash의 내장 세트가 vset으로 전송된 또 다른 옵션 으로 해석됩니다 . ~에서GNU 매뉴얼 페이지 세트:

-v 쉘 입력 행을 읽은 대로 인쇄합니다.

시스템에서 로그아웃하면 또 다른 증상이 나타나며 화면에 다음과 같은 내용이 인쇄됩니다.

logout
# ~/.bash_logout: executed by bash(1) when login shell exits.

# when leaving the console clear the screen to increase privacy

if [ "$SHLVL" = 1 ]; then
    [ -x /usr/bin/clear_console ] && /usr/bin/clear_console -q
fi

관련 정보