ServerFault에서 이 문제를 발견했습니다.
^V
나는 이 부분을 오래 전부터 알고 있었다. 해당 게시물 에서 제가 관심을 갖는 점 은 OP가 탭 완성에서 문자를 (캐럿 다음에 ) 로 처리 ^C
할 수 있다는 것입니다 . 화면에 표시됩니다.^C
C
ls
ls -b
\003
ls -N
^C
ls --show-control-chars
ls
첫 번째 질문은 탭 완성과 동일한 유형의 출력(예: ^C
캐럿 다음에 C
) 을 생성 하는 쉬운 방법이 있습니까 ?입니다. ( cat -v
행동).
$LANG
$LC_*
두 번째 질문은 환경 변수가 탭 완성으로 생성된 출력에 어떻게 영향을 미치는가입니다( complete
Bash 매뉴얼의 섹션 8에 문서화되어 있지만 이에 대해 아무것도 찾을 수 없는 것 같습니다).
저는 bash
4.3을 사용하고 있지만 다른 쉘에 대한 솔루션도 환영합니다.
답변1
이 동작은 모든 쉘에서 동일하지 않습니다.
Bourne Again 쉘은 설명된 대로 작동하여 해당 문자가 쉘에 입력되는 방식과 일치하지 않는 표현으로 파일 이름을 표시합니다. TENEX C 쉘도 동일한 기능을 수행합니다. 두 경우 모두 문자 시퀀스가 ^C
한 문자 파일 이름과 일치하지 않습니다.
Almquist 및 Korn 쉘은 많은 터미널에서 아무 작업도 수행하지 않는 제어 문자만 작성하고 완성 목록을 표시할 때 열 너비 계산에 너비 1을 포함하므로 이는 잘못된 것입니다. 이로 인해 열 정렬이 실패합니다.
Z 쉘은 명령 입력 사용과 관련된 작업을 수행하는 유일한 쉘입니다. 메뉴 기반 탭 완성 기능은 파일 이름 을 $'\003'
.rm
rm
ZLE의 탭 완성으로 명령에 대해 채워지는 내용, Z 쉘을 사용하여 파일을 삭제하십시오.
RM $'\003'
Korn 및 Almquist 하우징과 호환됩니다.
이것은 사소한 일입니다.
이 -w
옵션을 사용하면 제어 문자가 있는 그대로 출력되지만 많은 터미널에서는 아무 작업도 수행되지 않습니다. 그러나 적어도 ls
너비가 0이고 열 정렬 계산 오류를 일으키지 않는다는 것을 깨닫는 건전한 정신이 있습니다.
예, 이것은 FreeBSD/TrueOS입니다 ls
.
그리고 어떤 구성도 ls
다른 사용자의 동작과 일치할 수 없습니다.
둘 -B
다 -b
특별한 C 이스케이프 시퀀스가 없는 문자에 대해 장식되지 않은 8진수 이스케이프 시퀀스를 인쇄합니다. 하지만 쉘은 제공되지 않습니다꾸미지 않은목록에서 8진수 이스케이프 시퀀스를 완성합니다. Z 셸은 가장 가깝지만 $'…'
완성 시 8진수 이스케이프 시퀀스에 대한 참조를 사용합니다.
Bourne Again 및 TENEX C 쉘이 파일 이름을 표시하는 방식과 일치하는 것은 없습니다.
지역 설정
로케일은 기본적으로 여기서 관련이 없습니다. 이 문자는 인쇄되지 않는 제어 문자이며 로케일 설정과 거의 관련이 없습니다. C0 시리즈(EBCDIC 팬)는 거의 보편적으로 제어 문자로 간주됩니다.