답변:
귀하의 의견으로는 쉘 이 무엇인지 정확히 혼란스러워하는 것 같습니다 . 커널은 시스템 관리를 담당합니다. 실제로 프로그램을로드하고 실행하고, 파일에 액세스하고, 메모리를 할당하는 등의 부분입니다. 그러나 커널에는 사용자 인터페이스가 없습니다. 다른 프로그램을 중개자로 사용해야 만 통신 할 수 있습니다.
쉘은 프롬프트를 인쇄하고 사용자로부터 입력 행을 읽은 다음 파일을 조작하거나 다른 프로그램을 실행하기위한 하나 이상의 명령으로 해석하는 프로그램입니다. 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 , ksh 및 zsh 와 같은 고급 셸 에는 일반적으로 비표준 기능 (일반적으로 상호 작용을 위해)을 구현하기 위해 더 많은 내장 기능이 있습니다. 각 쉘의 매뉴얼에는 어떤 명령이 내장되어 있는지 알려주지 만, 일부 쉘 ( 최소한 zsh )은 더 많은 내장 기능을 제공 할 수있는 동적으로로드 가능한 모듈을 지원합니다.
¹ POSIX에는 알려지지 않았지만 ksh 및 기타 여러 쉘에서 특별합니다.
² POSIX에서는 보통이지만 ksh 및 여러 다른 쉘에서는 특별합니다.
³ 에서은 ksh
, times
주위에 래퍼입니다 time
키워드 : 그것의 별칭이다 { { time;} 2>&1;}
. POSIX를 사용하면 time
일반 구문 분석이나 전체 파이프 라인 (ksh, zsh의 bash)에 적용되는 키워드가있는 외부 유틸리티가 될 수 있습니다.
while IFS= read -r line
?
read
는 특별한 내장 기능 이 아니므로 IFS=read
명령 기간 동안에 만 변수를 설정합니다.
내장은 외부 프로그램이 아니라 쉘이 제공하는 명령입니다. 다음은 bash
내장 함수 (bash 매뉴얼 페이지에도 나와 있음) 및 zsh
내장 함수 목록 입니다. ksh
를 실행하여 목록을 제공합니다 builtin
.
특정 명령이 내장되어 있는지 확인하려면을 실행할 수 있습니다 type command
. 시도 type for
및 type ls
이를 볼 수 있습니다.
type
트릭을 수행하는 것 같습니다. 고마워요 ...하지만 여전히 "쉘에서 제공하는"의 의미가 궁금합니다 ... 아마도 쉘 이 커널과 어떻게 관련되어 있는지 더 잘 이해할 필요가 있습니다 ....하지만 오전 2시에는 아닙니다. 내일로 돌아 가기
모든 배포판과 셸에는 기본 제공 셸 함수와 다른 명령 모음이 있습니다. 일반적으로 쉘은 가장 일반적이고 간단한 기능을 내장하여 시간, 속도 및 통합 기능을 나머지 기능 세트와 절약합니다. 다른 시스템 프로세스를 시작할 필요가 없기 때문에 오버 헤드가 훨씬 낮습니다. 그러나 혼합하여 일치시킬 수 있습니다. 무언가를위한 하나의 쉘을 실행할 수 있지만 시스템에서도 해당 명령을 가질 수 있습니다. 일반적으로 내장 기능이 우선하지만 제어 할 수 있습니다.
실행하여 특정 명령이 내장되어 있는지 쉽게 확인할 수 있습니다 type mycommand
. 대부분의 쉘 매뉴얼 페이지에는 내장 목록이 있습니다.
편집 : 사용이 type
명령은 내장인지 여부를 확인하려면, 그렇지 않은 경우 것은 which
이에서 실행 될 위치를 배울 수 있습니다.
=>"/bin/echo" and
형식 echo =>"echo is a shell builtin", but 'which dd
=> "/ bin / dd"및 type dd
=> "dd is / bin / dd"입니다. ....
type
무엇이 실행되고 있는지에 대한 더 나은 지표이지만, 당신 echo
은 내장되어 있고 그 이름을 가진 응용 프로그램이 있음을 알 수 있습니다. 쉘에 내장 시스템이 없으면 시스템이 실행됩니다.
which
반드시 내장 명령 일 필요는 없으며, 그렇지 않으면 쉘의 내장에 대해 알 수 없습니다. POSIX는 type
내장 명령이어야하므로 항상 내장에 대해 알고 있습니다.
which
에 type
또는 옵션 등의 일부 세트 alias which='type -path'
-이 혼란의 원인이 될 수 있습니다.
which
로 교체 되기 전까지 는 이를 공표 할 수 없습니다 type
. 나는 프로그램을 결정할 때, 알지 못하고 type
찢어지기에 매우 놀랐습니다 which
.