왜 쉘 내장을 대문자로 실행할 수 없지만 다른 명령을 사용할 수 있습니까?


33

왜 이런거야?

내가 할 때

CD ~/Desktop

데스크탑으로 이동하지 않습니다. 하지만 이것은:

echo "foo
bar" | GREP bar

나에게 준다 :

bar

4
확인 alias GREP하거나 which GREP출력 하십시오 .
chepner

1
당신은 간다. 와 이름 GREP이 다른 명령 이 있습니다 grep. (실제로 그것은 하드 링크 또는 기호 링크 /usr/bin/grep일 수 있지만 쉘의 관점에서 별도의 명령입니다.)
chepner

12
잠깐 : Mac OS X를 사용하고 있습니까? HFS +는 기본적으로 대소 문자를 유지 하므로 파일 을 만들 때 대소 문자가 중요 하지만 파일이 존재하면 조회는 대소 문자를 구분하지 않습니다. 즉, bash이라는 파일을 요청할 수 GREP있지만 파일 시스템 grep은 일치하는 것으로 간주 합니다.
chepner

1
예, 유닉스이기 때문입니다.
DisplayName

4
파일 시스템은 운영 체제와 독립적입니다. Mac OS X에서 다른 파일 시스템을 사용할 수 있으며 이론적으로 다른 운영 체제에서 HFS +를 사용할 수 있습니다. 또한 HFS +는 대소 문자를 구분할 수 있습니다. 사례 보존 동작은 역사적 이유로 기본값입니다.
chepner

답변:


71

다른 질문에서 OS X를 사용하고 있다고 생각합니다. OS X의 기본 HFS + 파일 시스템은 대소 문자를 구분하지 않습니다. 동일한 디렉토리에 "abc"와 "ABC"라는 두 파일을 가질 수 없으며 액세스하려고합니다. 두 이름 중 하나가 같은 파일로 이동합니다. Cygwin에서 또는 대소 문자를 구분하지 않는 파일 시스템 (예 : FAT32 또는 ciopfs ) 에서 동일한 상황이 발생할 수 있습니다.

grep실제 실행 파일 이므로 파일 시스템 (의 디렉토리 PATH) 에서 조회됩니다 . 경우에 쉘 외모 /usr/bin중 하나에 대해 grep또는 GREP그것이 발견 할 것이다 grep실행.

셸 내장은 파일 시스템에서 조회 되지 않습니다. 내장되어 있기 때문에 셸 자체의 (대소 문자 구분) 문자열 비교를 통해 액세스됩니다.

당신이 겪고있는 것은 흥미로운 사건입니다. 하지만 cd대소 민감하게 액세스되는 내장이있다, CD실행으로 발견된다 /usr/bin/cd. cd실행 꽤 쓸모가 : 때문에 cd현재 쉘 실행 환경에 영향을 미치는, 그것은 항상 쉘로 제공되는 일반 내장 ,하지만이 cd실행 POSIX을 위하여 자체에 대한 디렉토리를 변경하고 즉시 종료 어쨌든이 주변 쉘을 떠나, 어디서 시작했는지

당신은 type내장으로 이것들을 시험해 볼 수 있습니다 :

$ type cd
cd is a shell builtin
$ type CD
CD is /usr/bin/CD

type해당 명령을 실행할 때 쉘이 수행 할 작업을 알려줍니다. 실행 cd하면 내장 기능에 액세스하지만 CD실행 파일을 찾습니다. 다른 내장의 경우 내장 및 실행 파일이 합리적으로 호환 echo되지만 (try ) cd불가능합니다.


1
좋은 대답입니다. cygwin을 말하려고했는데 같은 효과가 있습니다.
Joshua

@Joshua OP의 문제는 해결되었지만 더 많은 독자들에게는 cygwin 기반 답변이 기존 답변만큼 유용 할 것이라고 생각합니다. 어쩌면 짧은 경우 에도이 답변을 별도의 답변으로 만들 수 있으며 자세한 내용은 기존 답변을 연기 할 수 있습니까?
Volker Siegel

1
posix가 cd와 같은 쓸모없는 명령을 요구하는 이유는 무엇이며, osx의 내부 CD가 적합하지 않은 이유는 무엇입니까?
John

2
51 개 공감! 코멘트 대신에 답변을 게시했을 것입니다 :)
chepner

1
/ usr / bin / cd에는 목적이 있습니다. 구문은 / usr / bin / cd 디렉토리 프로그램 인수입니다.
Joshua
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.