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


72

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

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

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

답변:


90

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

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

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

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

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

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


실제로 응용 프로그램은 인터럽트를 발행하여 커널과 통신합니다.
Nathan Osman

11
@George : 응용 프로그램은 운영 체제 및 아키텍처에 따라 인터럽트를 사용하거나 사용하지 않을 수있는 syscall을 발행하여 커널과 통신합니다. 일반적으로 사용자는 인터럽트를 발행하지 않습니다.
Gilles

2
@cjm : 당신이 그것을 설명 할 때 너무 간단하게 들립니다. .. 유쾌하게 안개;) ... 감사합니다
Peter.O

@ 질 : 정말? 모든 사용자 모드 프로그램이 인터럽트를 통해 커널과 통신한다고 생각했습니다 (물론 특정 아키텍처에서).
Nathan Osman

2
@cjm 매우 철저하고 유익한 답변. 나는 그것을 많이 배웠습니다. :)
ankush981

37

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

  • 일부 유틸리티예약어 가 아니더라도 실제로 프로그래밍 언어로 쉘의 일부입니다 . 그들은 제어 흐름 유틸리티 (되어 ., :, 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)에 적용되는 키워드가있는 외부 유틸리티가 될 수 있습니다.


3
이러한 차이점은 정말 중요한 것입니다.
dmckee

빠른 질문입니다. "일반 매개 변수 할당"은 무엇을 의미합니까 while IFS= read -r line?
Sergiy Kolodyazhnyy

@SergiyKolodyazhnyy read는 특별한 내장 기능 이 아니므로 IFS=read명령 기간 동안에 만 변수를 설정합니다.
Gilles

10

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

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


type트릭을 수행하는 것 같습니다. 고마워요 ...하지만 여전히 "쉘에서 제공하는"의 의미가 궁금합니다 ... 아마도 이 커널과 어떻게 관련되어 있는지 더 잘 이해할 필요가 있습니다 ....하지만 오전 2시에는 아닙니다. 내일로 돌아 가기
Peter.O

1

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

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

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


@ Caleb : 귀하의 의견에 감사드립니다.하지만 정확히 "시스템 프로세스"가 무엇인지 궁금해합니다. 나는 계속해서 참조를보고 있지만 구별이 어디에 있는지 이해하지 못합니다. '어떻게'가 절대 지표인지 확인하십시오.) 예를 들어 echo =>"/bin/echo" and 형식 echo =>"echo is a shell builtin", but 'which dd=> "/ bin / dd"및 type dd=> "dd is / bin / dd"입니다. ....
Peter.O

"시스템 프로세스"는 커널이 관리하는 독립적 인 응용 프로그램으로 시작되고 있다는 것을 의미합니다. 내장의 경우 대안은 이미 실행중인 쉘 코드에서 하위 기능을 실행하는 것입니다. 당신이 제공하는 예에서, type무엇이 실행되고 있는지에 대한 더 나은 지표이지만, 당신 echo은 내장되어 있고 그 이름을 가진 응용 프로그램이 있음을 알 수 있습니다. 쉘에 내장 시스템이 없으면 시스템이 실행됩니다.
Caleb

2
which반드시 내장 명령 일 필요는 없으며, 그렇지 않으면 쉘의 내장에 대해 알 수 없습니다. POSIX는 type내장 명령이어야하므로 항상 내장에 대해 알고 있습니다.
CJM

의 별명을 가진 많은 시스템의 선박 whichtype또는 옵션 등의 일부 세트 alias which='type -path'-이 혼란의 원인이 될 수 있습니다.
Random832

1
which로 교체 되기 전까지 는 이를 공표 할 수 없습니다 type. 나는 프로그램을 결정할 때, 알지 못하고 type찢어지기에 매우 놀랐습니다 which.
사용자 알 수 없음
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.