방금 아주 이상한 일이 일어났습니다. 오타가 심해서 이렇게 썼어요
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
표시됩니다 . +를 시도한 다음 . 그러면 표시되는 파일이 입니다 ..?~
^
?
touch
ctrlVEnterfooEnterls
?foo
ls -b
\rfoo
따라서 입력하면 rm .?~
일치하는 것입니다. 이 경우 ?
입력한 내용이 특정 실제 물음표가 아닌 단일 문자와 일치하는 와일드카드로 쉘에 의해 해석되기 때문입니다. rm
별칭을 사용했으므로 작업 rm -i
을 확인하고, 확인하면 C 스타일 이스케이프 코드를 표시합니다.
답변2
이 파일 이름에 있는 이상한 문자(그림 참조 rm
)는 문자 0177
( 0x7F
h / 127
d )입니다. 이것이 Del
역할입니다.
Bash 자동 완성이 일관되게 처리하지 못하는 것 같습니다. 인쇄할 수 없는 문자에 대해서는 a를 ls
인쇄합니다 ?
(기본값). 노력하다:
$ echo a > .$'\x7f'~
$ ls -b .??
.\177~
rm
도움이 되며 8진수 값을 인쇄합니다.
답변3
Tab 키를 누르면 쉘은 일종의 파일 이름 추측을 수행하고 8진수 177바이트에 대해 "^" 및 "?"라는 두 문자를 인쇄합니다. Ctrl-V를 누른 다음 Shift-Ctrl-?를 눌러 해당 값의 바이트가 포함된 파일 이름을 얻을 수 있습니다. (한 번에 세 개의 키) 테스트용입니다.
파일 이름은 점 캐럿 물음표 물결표가 아니라 점 8진수 177 물결표입니다. 다양한 프로그램은 8진수 177 값 바이트를 표현하는 다양한 방법을 선택합니다.