짧은 버전(TL;DR)
2개의 작은 한 줄 파일이 있습니다.~인 것 같다정확히 동일합니다:
$ cat f1 f2
./cconv.sh 100 EUR USD
./cconv.sh 100 EUR USD
하지만 그렇지 않습니다. 크기에는 1바이트 차이가 있습니다.
$ ls -l f1 f2
(...) 24 oct. 30 16:19 f1
(...) 23 oct. 30 16:19 f2
$ diff f1 f2
1c1
< ./cconv.sh 100 EUR USD
---
> ./cconv.sh 100 EUR USD
한번은 dhex
16진수로 차이를 계산한 적이 있습니다. 다음과 같습니다:
f1
다음으로 끝남c2 a0 55 53 44 0a
f2
다음으로 끝남20 55 53 44 0a
여기서 무슨 일이 일어나고 있는지 아는 사람 있나요? 차이점은 무엇이며, 더 중요하게는 그것이 어디에서 오는가?여기 링크가 있습니다dhex
결과 스크린샷 과 함께 두 파일이 모두 포함된 zip 파일입니다 .
긴 버전(추가 메모 포함)
이 두 파일은 내 것입니다 ~/.bash_history file
.
나는 조개껍질에서 매우 이상한 행동을 발견했습니다. 다음과 같은 매우 기본적인 스크립트를 사용하세요.
#!/bin/sh
echo $#
echo "$1"
echo "$2"
echo "$3"
exit 0
어떤 경우에는(어떤 경우에는???) 공백을 매개변수 구분 기호로 처리하지 않습니다.
$ ./cconv.sh 100 EUR USD
2
100
EUR USD
그러나 때로는 예상대로 작동합니다.
$ ./cconv.sh 100 EUR USD
3
100
EUR
USD
이게 나를 미치게 만들고 있어! 나는 무슨 일이 일어나고 있는지 알아내려고 몇 시간을 보냈습니다. 범위를 좁히기 위해 시도한 몇 가지 테스트는 다음과 같습니다.
- 저는 Debian 11, Gnome 3.38이 설치된 노트북을 사용합니다. 하지만 우연히도 완전히 동일한 OS(D11, G3.38)를 사용하는 가상 머신이 있고 모든 것이 가상 머신에서 잘 작동합니다. 분명히 내가 베어메탈 노트북에 뭔가를 하여 노트북이 이상하게 작동하게 만든 것이 틀림없습니다. 근데 뭐? ? ?
- 문제는 그래픽 세션에서만 발생하는 것으로 나타났습니다. tty를 열면(Ctrl+Alt+FN),좋은 결과
- 내 터미널 에뮬레이터가 의심됩니다. 하지만 동작은 다른 에뮬레이터에서도 동일합니다(Gnome Terminal, Terminator 및 Konsole을 사용해 보았지만 결과는 동일함)
- 나는 그것이 껍질이라고 생각합니다. 하지만 Bash나 Dash에서는 동작이 동일합니다.
- 제가 생각할 수 있는 모든 사용자 정의를 비활성화했습니다.
/etc/bashrc
, 및 을 일시적으로 삭제했습니다/etc/profile
./etc/inputrc
/etc/rc.local
- 임시 로 삭제
~/.bashrc
했는데~/.profile
~/.inputrc
- 모든 Gnome Shell 확장을 비활성화했습니다.
- 키보드에 문제가 있는 것 같아 USB 키보드를 연결하기도 했습니다. 같은 결과.
정말 혼란스럽고 무슨 일이 일어나고 있는지 모르겠습니다. 마침내 두 명령 사이에 약간의 차이가 있음을 발견했습니다 ~/.bash_history
. 하나는 내 Gnome 세션의 명령이고 다른 하나는 내 tty 세션의 명령입니다. 분명히 차이가 있지만 정확히 무엇이고 가능한 이유는 무엇입니까?
답변1
c2 a0
UTF-8 인코딩인가요?줄바꿈하지 않는 공백 문자. 일반적으로 일반 공백처럼 보이지만 쉘에서는 이를 공백으로 인식하지 않습니다.
일부 키맵에서는 AltGr+ Space또는 +와 같은 Option문자가 Space잘림 방지 공백을 생성합니다. 키맵에 AltGr파이프 문자가 있거나 그 뒤에 파이프 문자가 있으면 대신 Option입력하기가 더 쉬워지고 다음과 같은 오류가 발생한다면 흥미로울 것입니다.|<nbsp>
|<sp>
$ echo foo | grep .
bash: grep: command not found
(SE는 nbsp를 일반 공간으로 축소하므로 여기에서 복사하여 붙여넣어도 오류가 발생하지 않을 것입니다.)
다른 도구에서 매개변수를 복사하여 붙여넣으면 이상한 형식이 나타날 수 있지만 이는 프로그램에 따라 다릅니다.
바라보다쉘에서 nbsp 문자 처리캐릭터를 생성하지 않는 일부 솔루션.