이 질문의 목적은 특정 계산 문제를 해결하기보다는 호기심을 충족시키는 것입니다. 문제는 POSIX 적용 유틸리티가 일반적으로 쉘 구현에 내장되지 않는 이유입니다.
예를 들어, 기본적으로 일부 작은 텍스트 파일을 읽고 형식이 올바른지 확인하는 스크립트가 있지만 많은 문자열 조작으로 인해 내 컴퓨터에서 실행하는 데 27초가 걸립니다. 이러한 문자열 조작은 다양한 유틸리티를 호출하여 수천 개의 새로운 프로세스를 생성하므로 속도가 느립니다. grep
, sed
, cut
, tr
및 등의 유틸리티가 내장되어 있으면 expr
스크립트가 1초 이내에 실행될 것이라고 확신합니다 (C 사용 경험에 따르면).
많은 경우 이러한 유틸리티를 구축하면 셸 스크립트의 솔루션이 허용 가능한 성능을 발휘하는지 여부에 영향을 미치는 것 같습니다.
분명히 이러한 유틸리티를 내장하지 않기로 선택한 데에는 이유가 있습니다. 시스템 수준에서 한 버전의 유틸리티를 사용하면 여러 다른 버전의 유틸리티를 사용하는 다양한 셸을 피할 수 있습니다. 나는 그렇게 많은 새로운 프로세스를 생성하는 오버헤드를 유지해야 하는 다른 많은 이유를 실제로 생각할 수 없으며 POSIX는 유틸리티를 충분히 잘 정의하여 서로 다른 구현을 갖는 것이 모두 POSIX를 준수하는 한 큰 문제처럼 보이지 않습니다. 적어도 너무 많은 프로세스를 갖는 데 따른 비효율성만큼 큰 문제는 아닙니다.
답변1
POSIX 적용 유틸리티가 셸에 내장되어 있지 않은 이유는 무엇입니까?
POSIX 표준을 준수하려면 시스템이 다음과 같아야 합니다.필수의1 대부분의 유틸리티를 독립 실행형 명령으로 제공합니다 .
내장되어 있다는 것은 케이스 내부와 케이스 외부의 서로 다른 두 장소에 존재해야 한다는 것을 의미합니다. 물론 내장된 셸 스크립트 래퍼를 사용하여 외부 버전을 구현하는 것이 가능하지만 이는 유틸리티를 호출하는 셸이 아닌 응용 프로그램에 해로울 수 있습니다.
알아채다바쁜 상자제안하신 경로는 내부적으로 많은 명령을 구현하고 자체 연결을 사용하여 독립적인 변형을 제공함으로써 취해진 것입니다. 한 가지 문제는 명령 세트가 매우 클 수 있지만 구현이 종종 표준의 하위 세트이므로 호환되지 않는다는 것입니다.
또한 적어도ksh93
,bash
또한 zsh
실행 중인 셸이 공유 라이브러리에서 내장 함수를 동적으로 로드할 수 있는 사용자 지정 방법을 제공합니다. 기술적으로 모든 POSIX 유틸리티가 내장되어 구현되고 제공되는 것을 막을 수 있는 방법은 없습니다.
마지막으로, 최신 운영 체제에서는 새로운 프로세스를 생성하는 작업이 상당히 빨라졌습니다. 성능 문제가 있는 경우 스크립트를 더 빠르게 실행하기 위해 몇 가지 개선 사항을 적용할 수 있습니다.
하지만,모든 표준 유틸리티, 표의 일반 내장 기능을 포함하지만 특수 내장 유틸리티에 설명된 특수 내장 기능은 포함하지 않습니다.exec 함수 계열을 통해 액세스할 수 있도록 어떤 방식으로든 구현되어야 합니다.POSIX.1-2008의 시스템 인터페이스 볼륨에 정의된 대로 이를 요구하는 표준 유틸리티(env, find, nice, nohup, time, xargs)에서 직접 호출할 수 있습니다.
답변2
쉘 스크립트는 이 속도로 실행되지 않을 것으로 예상됩니다. 스크립트 속도를 높이려면 Perl에서 사용해 보세요. 여전히 너무 느린 경우 java 또는 c와 같은 정적으로 유형이 지정된 언어로 이동하거나 너무 느린 부분을 실행하려면 Perl용 C 모듈을 작성해야 합니다.
쉘은 프로토타입 제작의 첫 번째 수준입니다. 쉘로 개념을 증명할 수 있다면 더 많은 범위 검사를 수행할 수 있는 더 나은 스크립팅 언어로 이동하여 쉘을 많이 차지하게 됩니다.
Unix 운영 체제에는 더 큰 그림을 구성하는 잘 정의된 작업을 수행하는 많은 작은 프로그램이 포함될 것으로 예상됩니다. 이는 더 큰 프로그램을 분할하기 때문에 좋은 것입니다. 예를 들어, qmail을 살펴보고 sendmail과 비교해 보세요. 큐메일은 많은 프로그램으로 구성되어 있습니다:
http://www.nrg4u.com/qmail/the-big-qmail-picture-103-p1.gif
네트워크 데몬을 악용해도 큐 관리자를 악용하는 데 도움이 되지 않습니다.
답변3
~에서BASH 참조 매뉴얼,
별도의 유틸리티를 사용하여 얻을 수 없거나 편리하지 않은 기능을 구현하려면 내장 명령이 필요합니다.
여러분도 들어보셨을 거라 확신하지만 UNIX 철학은 기능이 제한된 여러 응용 프로그램에 크게 의존합니다. 모든 내장 항목에는 내장된 이유가 있습니다. 다른 사람들은 그렇지 않습니다. 내 생각에 더 흥미로운 질문은 "왜?예 pwd
내장? "
답변4
따라서 우리는 각 특정 요구 사항을 충족하기 위해 원래 도구를 최적화하기 위해 리소스를 동원하지 않았습니다. 우리가 설명해야 할 것은 이 특정한 욕구를 달성하는 데 얼마나 많은 비용이 들 것인가 하는 것입니다.
POSIX는 다양한 구현이 큰 문제가 되지 않는 만큼 충분한 유틸리티를 정의합니다.
이것은 잘못된 가정입니다. :-P.
Post-POSIX 시스템은 계속해서 더욱 강력하고 편리해지고 있지만 나중에 생각해도 표준으로는 결코 따라잡을 수 없습니다.
Ubuntu는 기존 System V init 부팅 프로세스를 최적화하기 위해 간소화된 POSIX 쉘 스크립트로 전환하려는 노력을 시작했습니다. 실패했다고 말하는 것은 아니지만 정리해야 할 많은 오류가 발생했습니다. "bashisms", 기능이 사용 가능하다는 가정하에 실행되는 스크립트 /bin/sh
.bash
POSIX sh는 좋은 범용 프로그래밍 언어가 아닙니다. 그것은기초적인목적은 대화형 쉘로 제대로 작동하는 것입니다. 스크립트에 명령을 저장하기 시작하면 접근 중이라는 점에 유의하세요.튜링 오일 피트. 예를 들면 불가능하다일반 파이프라인 중간에서 결함 감지. 이를 위해 bash
추가되었지만 set -o pipefail
POSIX에는 없습니다.
Python보다 더 복잡한 거의 모든 유틸리티는 유사하지만 표준화되지 않은 기능을 제공합니다 true
.
설명한 작업 범주에 대해 Awk, Perl, 그리고 이제 Python에 대한 대략적인 아이디어를 얻을 수 있습니다. 다양한 도구가 독립적으로 만들어지고 발전했습니다. GNU Awk가 libutilposixextended에 포함될 것으로 예상하십니까?
나는 우리가 지금 여러분에게 알려줄 수 있는 보편적으로 더 나은 방법이 있다고 제안하는 것이 아닙니다. 나는 Python에 애착이 있습니다. 비록 GNU Awk의 고유한 기능 중 일부에 실망했지만 Awk는 놀라울 정도로 강력합니다. 그러나 요점은 많은 수의 문자열(아마도 파일 라인에서)을 개별적으로 처리하는 것이 POSIX 쉘이 수행하도록 설계된 것이 아니라는 것입니다.