Bash 자동 완성은 ls와 다른 파일 이름을 제공합니다.

Bash 자동 완성은 ls와 다른 파일 이름을 제공합니다.

방금 아주 이상한 일이 일어났습니다. 오타가 심해서 이렇게 썼어요

cp filename.xsl .^?~

네, 맞아요. 점-캐럿-물음표-물결표! 진실은 허구보다 낯설다.

상황이 더욱 이상해집니다. 내가 입력하는 동안

cat .

그런 다음 클릭 TAB하면

./    ../    .^?~

하지만 내가 그렇게 하면 ls -a, 나는 얻는다.

.    ..    .?~

마지막으로 내가 할 때

rm .?~

삭제 명령은 다음과 같은 메시지를 표시합니다.

rm: remove write-protected regular file `.\177~'?

성공적으로 삭제되기 전에. 캐럿의 존재가 감소하는 이유는 무엇입니까?

답변1

캐럿은 일반적으로 ctrl누른 키를 나타내는 데 사용되거나 제어 문자이기 때문입니다.

실제로 입력하는 키 시퀀스는 다음과 같습니다.

cp filename.xsl .ctrl+Vbackspace~Enter

파일을 홈 디렉터리( ~)에 복사하려고 시도 중일 수 있습니다. ctrl+ 를 입력하여 이 작업을 반복 할 수 있습니다 Vbackspace. ^?화면에 인쇄된 것을 볼 수 있습니다 .

인쇄되지 않는 문자가 변환된 파일을 볼 수 있습니다.C형다음과 같이 이스케이프하세요( -b중요한 플래그이지만 파일이 점으로 시작하므로 다음도 필요합니다 -a.

$ ls -ab
.  ..  .\177~

그렇지 않은 경우 단순히 생략되었기 때문 이 아니라 우선순위가 아닌 문자가 로 표시되기 때문에 -b표시됩니다 . +를 시도한 다음 . 그러면 표시되는 파일이 입니다 ..?~^?touchctrlVEnterfooEnterls?fools -b\rfoo

따라서 입력하면 rm .?~일치하는 것입니다. 이 경우 ?입력한 내용이 특정 실제 물음표가 아닌 단일 문자와 일치하는 와일드카드로 쉘에 의해 해석되기 때문입니다. rm별칭을 사용했으므로 작업 rm -i을 확인하고, 확인하면 C 스타일 이스케이프 코드를 표시합니다.

답변2

이 파일 이름에 있는 이상한 문자(그림 참조 rm)는 문자 0177( 0x7Fh / 127d )입니다. 이것이 Del역할입니다.

Bash 자동 완성이 일관되게 처리하지 못하는 것 같습니다. 인쇄할 수 없는 문자에 대해서는 a를 ls인쇄합니다 ?(기본값). 노력하다:

$ echo a > .$'\x7f'~
$ ls -b .??
.\177~

rm도움이 되며 8진수 값을 인쇄합니다.

답변3

Tab 키를 누르면 쉘은 일종의 파일 이름 추측을 수행하고 8진수 177바이트에 대해 "^" 및 "?"라는 두 문자를 인쇄합니다. Ctrl-V를 누른 다음 Shift-Ctrl-?를 눌러 해당 값의 바이트가 포함된 파일 이름을 얻을 수 있습니다. (한 번에 세 개의 키) 테스트용입니다.

파일 이름은 점 캐럿 물음표 물결표가 아니라 점 8진수 177 물결표입니다. 다양한 프로그램은 8진수 177 값 바이트를 표현하는 다양한 방법을 선택합니다.

관련 정보