나는 이로 인해 set -x
Bash 사용자가 디버그 모드에 들어가게 된다는 것을 알고 있으며 디버그 모드에서 풀타임으로 일하는 것이 Bash에서 발생할 수 있는 문제를 더 잘 처리하는 데 도움이 될 것이라고 생각합니다.
다음을 사용하는 데 문제가 있습니다 set -x
.
배포판(Ubuntu 16.04)의 기본 탭 완성 기능을 사용하여 디렉터리 이름을 완성하려고 하면 매우 길고 잘못된 출력이 표시됩니다.
예를 들어 다음 명령 중 하나를 실행합니다 $PWD
./var/www/html/
cd ~/u
[탭 완성 완료 u
: ulcwe
]
cd ~ && cd u
[탭 완성 완료 u
: ulcwe
]
두 예제 모두 매우 길고 왜곡된 출력을 얻습니다.
+ return 0
+ local -a toks
+ local quoted x tmp
+ _quote_readline_by_ref '~/u' quoted
+ '[' -z '~/u' ']'
+ [[ ~/u == \'* ]]
+ [[ ~/u == \~* ]]
+ printf -v quoted '~%q' /u
+ [[ ~/u == *\\* ]]
+ [[ ~/u == \$* ]]
++ compgen -d -- '~/u'
+ x='~/ulcwe'
+ read -r tmp
+ toks+=("$tmp")
+ read -r tmp
+ [[ -d != -d ]]
+ [[ -n '' ]]
+ [[ 1 -ne 0 ]]
+ compopt -o filenames
+ COMPREPLY+=("${toks[@]}")
+ return 0
lcwe/
lcwe
끝까지 주의하세요 .
위의 출력은 더 큰 출력의 일부일 뿐입니다.
디버그 모드( )에서 풀타임으로 계속 작업 set -x
하지만 실행 탭이 완료될 때 모든 출력이 표시되지 않을 수 있나요?
답변1
이는 사용 중인 셸의 프로그래밍 가능한 완료 기능 때문입니다.
의 명령 및 파일 이름에 대한 기본 탭 완성이 만족스러우면 bash
다음을 실행하세요.
complete -r
~/.bashrc
현재 쉘 환경 내에서 함수 호출 등과 관련된 "멋진"(프로그래밍 가능) 완성을 제거할 수 있습니다 .
프로그래밍 가능한 완성을 끈 후에도 기본 파일 이름 완성(질문의 예에서 했던 것처럼)은 계속 작동합니다.
프로그래밍 가능한 완성 기능은 일부 셸에서 사용할 수 있으며 명령줄 상태 등을 확인하는 콜백 함수를 연결하여 사용자가 다음에 삽입할 수 있는 가능한 문자열을 찾을 수 있습니다. 예를 들어 ssh
then을 입력 Space하면 파일을 구문 분석하여 연결할 호스트 이름을 가져오는 Tab함수를 호출할 수 있고 , then을 입력하면 함수가 명령을 실행하여 현재 저장소에서 사용 가능한 분기를 찾을 수 있습니다 .~/.ssh/config
git checkout
SpaceTabgit
일부 사용자는 속도 및/또는 생산성 이유로 프로그래밍 가능한 완성 기능을 사용하지만, 그렇습니다. set -x
대화형 셸 세션에서 활성화된 경우 이러한 작업은 터미널에서 추적 출력을 생성합니다.
Tab나는 "등 뒤에서 마술을 부리는" 간단한 누르기를 원하지 않기 때문에 어떤 쉘에서도 프로그래밍 가능한 완성을 좋아한 적이 없습니다.온갖 흥미로운 방법으로. 저도 좀 게으르다고 생각하는데, 그건 어디까지나 제 개인적인 생각일 뿐입니다.