[unix] 내장 명령과 그렇지 않은 명령의 차이점은 무엇입니까?

내장 명령과 명목상 동일한 작업을 수행 할 수있는 다른 명령간에 본질적인 차이가 있습니까?

예. 내장은 “특별한”대우를 받습니까? … 그것들을 실행하는 오버 헤드가 적습니까? .. 또는 단순히 ‘내장’일 뿐입니 까? 자동차의 대시 보드처럼?

…이 내장에 대한 명확한 (현재) 목록이 있습니까?



답변

귀하의 의견으로는 이 무엇인지 정확히 혼란스러워하는 것 같습니다 . 커널은 시스템 관리를 담당합니다. 실제로 프로그램을로드하고 실행하고, 파일에 액세스하고, 메모리를 할당하는 등의 부분입니다. 그러나 커널에는 사용자 인터페이스가 없습니다. 다른 프로그램을 중개자로 사용해야 만 통신 할 수 있습니다.

쉘은 프롬프트를 인쇄하고 사용자로부터 입력 행을 읽은 다음 파일을 조작하거나 다른 프로그램을 실행하기위한 하나 이상의 명령으로 해석하는 프로그램입니다. GUI가 발명되기 전에 쉘은 OS의 기본 사용자 인터페이스였습니다. MS-DOS에서는 쉘을 호출 command.com했으며 다른 사람을 사용하려고 시도한 사람 은 거의 없었습니다. 그러나 유닉스에서는 오랫동안 사용자가 선택할 수있는 여러 쉘 이있었습니다.

그들은 3 가지 유형으로 나눌 수 있습니다. Bourne 호환 쉘은 원래 Bourne 쉘 에서 파생 된 구문을 사용합니다 . C 쉘은 원래 C 쉘 의 구문을 사용합니다 . 그런 다음 자체 구문을 발명하거나 프로그래밍 언어에서 빌려온 비 전통적인 쉘이 있으며 일반적으로 처음 두 유형보다 덜 인기가 있습니다.

내장 명령은 단순히 다른 프로그램을로드하고 실행하기위한 요청으로 해석하지 않고 쉘이 자체적으로 수행하는 명령입니다. 이것은 두 가지 주요 효과가 있습니다. 첫째, 프로그램을로드하고 실행하는 데 시간이 걸리기 때문에 일반적으로 더 빠릅니다. 물론 명령 실행 시간이 길수록로드 시간이 전체 실행 시간과 비교할 때로드 시간이 덜 중요합니다 (로드 시간이 상당히 일정하기 때문).

둘째, 내장 명령은 쉘의 내부 상태에 영향을 줄 수 있습니다. 외부 프로그램이 쉘의 현재 디렉토리를 변경할 수 없기 때문에 이와 같은 명령 이 내장되어 cd 있어야하는 이유 입니다. 와 같은 다른 명령 echo은 효율성을 위해 기본 제공 될 수 있지만 외부 명령이 될 수없는 본질적인 이유는 없습니다.

어떤 명령이 내장되어 있는지는 사용중인 쉘에 따라 다릅니다. 목록을 보려면 해당 설명서를 참조해야합니다 (예 : bash내장 명령은 설명서의 4 장에 나와 있습니다 ). type명령이 내장 (쉘은 POSIX 호환 인 경우) 인 경우 POSIX가 그 필요하기 때문에 명령은 말할 수 type내장합니다. 경우 which쉘에 내장되어 있지 않은 경우, 그것은 아마 당신의 쉘의 내장 기능에 대해 알 수 없습니다 만, 단지 외부 프로그램을 찾습니다.


답변

내장 유틸리티에는 세 가지 레벨이 있습니다.

  • 일부 유틸리티예약어 가 아니더라도 실제로 프로그래밍 언어로 쉘의 일부입니다 . 그들은 제어 흐름 유틸리티 (되어 ., :, break, continue, return, trap, exit, exec, eval), 파라미터 관련 유틸리티 ( set, unset, shift, export, readonly, local¹, typeset¹) 별명 유틸리티 ( alias², unalias²)과 times내강. 이러한 특수 내장 기능 은 다음과 같이 특별 처리됩니다.

    • 특수한 내장 함수에 잘못된 인수를 전달하면 오류 메시지가 표시된 후 다음 명령으로 건너 뛰기보다는 쉘 자체가 중단 될 수 있습니다.
    • 사전 할당 구문 foo=bar utility은 다른 의미를 갖습니다. foo=bar; utility유틸리티 기간 동안 만 환경에 할당하는 대신 일반 매개 변수 할당 (예 :와 동일 )입니다.
  • 일부 유틸리티 는 쉘의 내부 설정에 따라 작동하므로 쉘 내부에서 구현 해야 합니다. 여기에는 다음이 포함됩니다.

    • 같은 쉘의 현재 디렉토리에 따라 행동 유틸리티 cd, dirs, pushd, popd,
    • 작업 제어와 같은 유틸리티 bg, disown, fg, jobs, wait,
    • 읽거나 같은 다른 쉘의 속성을 조작 유틸리티 builtin, command, hash, read, type, ulimit, umask,
    • 같은 사람들이 존재있어 대화 형 기능, 관련 유틸리티 fc, history, bind.
  • 일부 유틸리티는 일반적으로 순수을 위해 만들어진 기능으로 구현 성능 : echo, printf, test, true, false.

bash , kshzsh 와 같은 고급 셸 에는 일반적으로 비표준 기능 (일반적으로 상호 작용을 위해)을 구현하기 위해 더 많은 내장 기능이 있습니다. 각 쉘의 매뉴얼에는 어떤 명령이 내장되어 있는지 알려주지 만, 일부 쉘 ( 최소한 zsh )은 더 많은 내장 기능을 제공 할 수있는 동적으로로드 가능한 모듈을 지원합니다.

¹ POSIX에는 알려지지 않았지만 ksh 및 기타 여러 쉘에서 특별합니다.
² POSIX에서는 보통이지만 ksh 및 여러 다른 쉘에서는 특별합니다.
³ 에서은 ksh, times주위에 래퍼입니다 time키워드 : 그것의 별칭이다 { { time;} 2>&1;}. POSIX를 사용하면 time일반 구문 분석이나 전체 파이프 라인 (ksh, zsh의 bash)에 적용되는 키워드가있는 외부 유틸리티가 될 수 있습니다.


답변

내장은 외부 프로그램이 아니라 쉘이 제공하는 명령입니다. 다음은 bash내장 함수 (bash 매뉴얼 페이지에도 나와 있음) 및 zsh내장 함수 목록 입니다. ksh를 실행하여 목록을 제공합니다 builtin.

특정 명령이 내장되어 있는지 확인하려면을 실행할 수 있습니다 type command. 시도 type fortype ls이를 볼 수 있습니다.


답변

모든 배포판과 셸에는 기본 제공 셸 함수와 다른 명령 모음이 있습니다. 일반적으로 쉘은 가장 일반적이고 간단한 기능을 내장하여 시간, 속도 및 통합 기능을 나머지 기능 세트와 절약합니다. 다른 시스템 프로세스를 시작할 필요가 없기 때문에 오버 헤드가 훨씬 낮습니다. 그러나 혼합하여 일치시킬 수 있습니다. 무언가를위한 하나의 쉘을 실행할 수 있지만 시스템에서도 해당 명령을 가질 수 있습니다. 일반적으로 내장 기능이 우선하지만 제어 할 수 있습니다.

실행하여 특정 명령이 내장되어 있는지 쉽게 확인할 수 있습니다 type mycommand. 대부분의 쉘 매뉴얼 페이지에는 내장 목록이 있습니다.

편집 : 사용이 type명령은 내장인지 여부를 확인하려면, 그렇지 않은 경우 것은 which이에서 실행 될 위치를 배울 수 있습니다.


답변