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~

이 없으면 단순히 을 생략한 것이 아니라 pritable이 아닌 문자가 로 표시되기 때문에 로 표시 -b됩니다 . +를 시도한 다음 을 시도 하십시오 . 당신이 보게 될 파일은 . 그러면 가 표시됩니다 ..?~^?touchctrlVEnterfooEnterls?fools -b\rfoo

따라서 rm .?~일치하는 경우 이 경우 ?입력한 은 셸에서 실제 물음표가 아닌 단일 문자와 일치하는 글로빙 와일드카드로 해석되기 때문입니다. rm에 별칭을 지정 하여 rm -i작업을 확인하고 수행할 때 C 스타일 이스케이프 코드를 표시합니다.

답변2

해당 파일 이름에 있는 이상한 문자( 로 표시됨 rm)는 문자 0177( 0x7Fh / 127d )입니다. 바로 그 Del캐릭터입니다.

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

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

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

답변3

Tab 키를 누르고 쉘이 일종의 파일 이름 추측을 수행하면 '^' 및 '?'라는 두 문자가 인쇄됩니다. 바이트 값 8진수 177의 경우 ctrl-V를 누른 다음 Shift-ctrl-?를 누르면 해당 값의 바이트로 파일 이름을 얻을 수 있습니다. (한 번에 세 개의 키) 테스트용입니다.

파일 이름은 dot-caret-questionmark-tilde가 아니라 dot-octal 177-tilde였습니다. 다양한 프로그램은 8진수 177 값 바이트를 다양한 방식으로 표현하기로 선택했습니다.

관련 정보