방금 엄청나게 이상한 일이 일어났습니다. 심각한 오타로 들어갔습니다
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
됩니다 . +를 시도한 다음 을 시도 하십시오 . 당신이 보게 될 파일은 . 그러면 가 표시됩니다 ..?~
^
?
touch
ctrlVEnterfooEnterls
?foo
ls -b
\rfoo
따라서 rm .?~
일치하는 경우 이 경우 ?
입력한 은 셸에서 실제 물음표가 아닌 단일 문자와 일치하는 글로빙 와일드카드로 해석되기 때문입니다. rm
에 별칭을 지정 하여 rm -i
작업을 확인하고 수행할 때 C 스타일 이스케이프 코드를 표시합니다.
답변2
해당 파일 이름에 있는 이상한 문자( 로 표시됨 rm
)는 문자 0177
( 0x7F
h / 127
d )입니다. 바로 그 Del
캐릭터입니다.
Bash 자동 완성이 일관되게 처리하지 못하는 것 같습니다. 인쇄할 수 없는 문자에 대해 ls
a를 인쇄합니다 ?
(기본값). 노력하다:
$ 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 값 바이트를 다양한 방식으로 표현하기로 선택했습니다.