쉘이 유틸리티에 대한 경로 이름 확장을 수행하는 이유는 무엇입니까?

쉘이 유틸리티에 대한 경로 이름 확장을 수행하는 이유는 무엇입니까?

이 질문은 다음의 후속 질문입니다.https://stackoverflow.com/questions/7136899/how-does-grep-work

적용 가능/사용 가능한 모든 파일을 shell확장하고 이를 .*.*grep

shell그렇게 할 필요가 있나요? 경로 이름 확장을 유틸리티 자체에 맡기는 것은 어떨까요?

답변1

한 가지 이유는 모든 유틸리티가 해당 기능을 구현해야 한다는 것입니다. 쉘이 이를 수행하는 경우 한 번만 구현됩니다.

답변2

왜냐하면 쉘이 이 기능을 제공하지 않는다면 모든 작은 유틸리티가 이를 구현해야 하기 때문입니다.

이는 또한 확장이 모든 명령에 대해 정확히 동일한 방식으로 작동하도록 보장합니다.

그런데 확장은 명령 인수에서만 발생하는 것이 아니라 쉘 스크립트의 어느 곳에서나 발생할 수 있습니다. 예를 들어:

for file in *.c; do something; done

답변3

셸이 해당 기능을 제공하지 않으면 모든 유틸리티는 자체 와일드카드 기능을 구현해야 합니다(그리고 아마도 대부분은 그렇게 하지 않을 것입니다). 따라서 각 유틸리티는 개별 파일 이름만 처리하면 되며 이는 훨씬 간단합니다.

답변4

"하나의 도구로 한 가지 일을 잘하라"는 것이 유닉스 철학이다. 왜 모든 유틸리티에서 코드 반복을 원하는 사람이 있을까요? main()이 Expand_pathnames()를 호출한 후에 각각의 유틸리티를 사용하는 이유는 무엇입니까? C 프로그램뿐만 아니라 모든 컴파일 언어와 스크립트 언어에도 그러한 부담을 가하는 이유는 무엇입니까? 그 모든 것에는 의미가 없습니다. 이것이 바로 Microsoft와 cmd.exe의 혐오스러운 것이 첫날부터 잘못된 이유입니다 :-)

그런데, 파일 이름 글로빙을 끄려면 다음을 사용하면 됩니다.

$ set -f
$ echo *
*
$ set +f
$ echo *
readme foo.o bar.txt

관련 정보