MacOS에서 대소문자를 구분하지 않는 bash의 이상한 동작

MacOS에서 대소문자를 구분하지 않는 bash의 이상한 동작
~/testing $ echo Hello > hello.txt
~/testing $ echo Goodbye > goodbye.txt
~/testing $ cat goodbye.txt hello.txt > HELLO.txt
^C
~/testing $ ls -l
total 9056
-rw-r--r--  1 user  user        8 25 Jul 16:21 goodbye.txt
-rw-r--r--  1 user  user  4631048 25 Jul 16:22 hello.txt
~/testing $ 

세계보건총회? 여기에 뭔가가 빠졌습니다. 파일을 무감각하게 삭제하는 옵션이 없나요? 이게 왜 원형으로 보이는 걸까요?

답변1

Mac OS X은 기본적으로 대소문자를 구분하지 않는 파일 시스템을 사용합니다. 변경하려면 대소문자를 구분하는 옵션을 사용하여 디스크를 다시 포맷해야 합니다. 주요 공급업체에서 작성한 일부 프로그램에 유의하세요.<cough>Adobe</cough>, <cough>Microsoft</cough>대소문자를 구분하는 파일 시스템에 심각한 문제가 있습니다.

파일 시스템은 대소문자를 구분하지 않지만 모든 파일은 대소문자를 구분하지 않습니다. 즉, +(대문자 H, 탭 순)라는 이름의 파일이 있으면 hello.txt완성 후보를 얻을 수 없습니다(쉘을 구분하지 않는 완성으로 설정하지 않는 한).shiftHTab

답변2

cat goodbye.txt hello.txt > HELLO.txt

사건의 연속:

  1. 쉘은 hello.txt를 0바이트로 자릅니다.
  2. cat은 hello.txt를 가리키는 stdout에byby.txt의 내용을 씁니다.
  3. cat은 hello.txt를 읽기 시작하고 읽은 내용을 stdout에 기록합니다. stdout은 여전히 ​​hello.txt를 가리킵니다. cat은 동일한 파일을 읽고 쓰기 때문에 파일 끝에 도달하지 않고 파일 시스템이 가득 찰 때까지 hello.txt에 계속 추가합니다.

답변3

OSX에서 디스크 포맷을 위한 기본 옵션은 HFS+ 저널링(대소문자 구분 안 함)입니다. 이 동작을 원할 경우 대소문자를 구분하도록 형식을 명시적으로 설정해야 합니다.

당신이 보고 있는 행동은 의도적인 것입니다.

관련 정보