이상한 문제가 있는데 StackExchange에서 비슷한 질문을 검색하는 방법을 잘 모르겠습니다.
이는 와 관련이 있습니다 Ubuntu 20.04 command-line
.
키를 누르면 TAB
AutoComplete는 "현재 명령에 대한 입력"의 일부로 매우 이상한 결과를 추가합니다.
예를 들어:
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
.eval
eval
이것케이스 내장. 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의 내장 세트가 v
set으로 전송된 또 다른 옵션 으로 해석됩니다 . ~에서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