쉘 스크립트는 매개변수 구분 기호로 공백을 사용하지 않습니다. (이 작은 파일 차이점을 설명할 수 있는 사람이 있습니까?)

쉘 스크립트는 매개변수 구분 기호로 공백을 사용하지 않습니다. (이 작은 파일 차이점을 설명할 수 있는 사람이 있습니까?)

짧은 버전(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

한번은 dhex16진수로 차이를 계산한 적이 있습니다. 다음과 같습니다:

  • 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 a0UTF-8 인코딩인가요?줄바꿈하지 않는 공백 문자. 일반적으로 일반 공백처럼 보이지만 쉘에서는 이를 공백으로 인식하지 않습니다.

일부 키맵에서는 AltGr+ Space또는 +와 같은 Option문자가 Space잘림 방지 공백을 생성합니다. 키맵에 AltGr파이프 문자가 있거나 그 뒤에 파이프 문자가 있으면 대신 Option입력하기가 더 쉬워지고 다음과 같은 오류가 발생한다면 흥미로울 것입니다.|<nbsp>|<sp>

$ echo foo | grep .
bash:  grep: command not found

(SE는 nbsp를 일반 공간으로 축소하므로 여기에서 복사하여 붙여넣어도 오류가 발생하지 않을 것입니다.)

다른 도구에서 매개변수를 복사하여 붙여넣으면 이상한 형식이 나타날 수 있지만 이는 프로그램에 따라 다릅니다.

바라보다쉘에서 nbsp 문자 처리캐릭터를 생성하지 않는 일부 솔루션.

관련 정보