셸 내장 명령에 대해 알아보기

셸 내장 명령에 대해 알아보기

에서배쉬 매뉴얼, 말한다

Builtin commands are contained >>> within <<< the shell itself

반품,이것대답은 지적한다

A built-in command is simply a command that the shell carries out itself,
instead of interpreting it as a request to load and run some
>>> other program <<<

을 실행하면 compgen -b모든 bash 4.4셸 내장 명령 목록이 표시됩니다. 예를 들어, 쉘 내장으로 표시 [되고 나열됩니다. kill하지만 실제 위치는 다음과 같습니다.

/usr/bin/[
/bin/kill

나는 이것이 builtin명령이 /bin/bash실행 파일로 컴파일된다는 것을 의미한다고 생각합니다. 그래서 저를 정말로 혼란스럽게 하는 것은 바로 이것입니다. 정정합니다. 그러나 builtin이것이 실제로 쉘의 일부가 아닌데 어떻게 a가 될 수 있습니까?

답변1

셸에 내장된 명령은 일반적으로 성능을 향상시키기 때문에 내장되어 있습니다. 부르다외부 printf예를 들어, 내장된 printf.

일부 유틸리티는 그렇지 않기 때문에필요내장되어 있습니다. 특별하지 않은 경우에는 다음과 같이 cd제공됩니다 .외부유용. 이렇게 하면 스크립트가 내장된 동등한 기능을 제공하지 않는 쉘에 의해 해석되더라도 스크립트가 중단되지 않습니다.

일부 셸 내장 명령은 동등한 외부 명령에 대한 확장도 제공합니다. 예를 들어 Bash는 printf다음을 수행할 수 있습니다.

$ printf -v message 'Hello %s' "world"
$ echo "$message"
Hello world

(변수로 인쇄) 외부에서는 /usr/bin/printf현재 쉘 세션의 쉘 변수에 액세스할 수 없고 변경할 수 없기 때문에 이 작업을 수행할 수 없습니다.

내장 유틸리티도 사용 가능아니요확장된 명령줄은 특정 길이보다 짧아야 합니다. 행위

printf '%s\n' *

printf그러므로 쉘 내장 명령어라면 안전하다. 명령줄 길이에 대한 제한은 execve()외부 명령을 실행하는 데 사용되는 C 라이브러리 함수에서 비롯됩니다. 명령줄과 현재 환경이 ARG_MAX바이트 보다 크면 ( getconf ARG_MAX셸 참조) 호출이 execve()실패합니다. 이 유틸리티가 셸에 내장되어 있으면 execve()호출할 필요가 없습니다.

내장 유틸리티는 $PATH에서 내장 명령을 비활성화하려면 bash다음을 사용하십시오 .

enable -n printf

짧은 유틸리티 목록이 있습니다.필요쉘에 내장됨(POSIX 표준에서 따옴)특수 내장 목록)

break
colon (:)
continue
dot (.)
eval
exec
exit
export
readonly
return
set
shift
times
trap
unset

이는 현재 쉘 세션의 환경 및 프로그램 흐름에서 직접 작동하기 때문에 내장되어야 합니다. 외부 유틸리티는 이를 수행할 수 없습니다.

흥미롭게도 cd이 목록에는 없지만 POSIX다음과 같이 말해보세요그것에 대해:

cd현재 쉘 실행 환경에 영향을 주기 때문에 항상 일반 쉘 내장으로 제공됩니다. 다음 중 하나와 같이 서브셸 또는 별도의 유틸리티 실행 환경에서 호출하는 경우:

(cd /tmp)
nohup cd
find . -exec cd {} \;

호출자 환경의 작업 디렉터리에는 영향을 주지 않습니다.

그래서 나는 "특수" 내장이 외부 대응물을 가질 수 없다고 가정하고 있습니다. 반면 cd이론적으로는 있을 수 있습니다(그러나 그다지 많은 일을 하지는 않을 것입니다).

답변2

당신은 (매우 당연하게도) 일부 내장 함수의 존재로 인해 혼란스러워합니다.둘 다내장 함수로그리고외부 명령으로. 따라서 예를 들어 명령이 있다는 것이 맞지만 /bin/[이것이 "실제 위치"가 에 있다는 의미는 아닙니다 /bin.

간단한 테스트 방법은 type스위치를 사용하여 실행하는 -a것이며 사용 가능한 명령 인스턴스가 모두 표시됩니다. 내 Arch 시스템에는 다음이 표시됩니다.

$ type -a [
[ is a shell builtin
[ is /sbin/[
[ is /usr/sbin/[
[ is /usr/bin/[

/sbin, /usr/sbin/bin는 모두 를 가리키는 심볼릭 링크 이므로 /usr/bin외부는 하나만 있습니다 [.

$ readlink -f /usr/sbin /sbin /bin/
/usr/bin
/usr/bin
/usr/bin

보시다시피, [이는 다양한 다른 쉘 내장 기능과 마찬가지로 내장 명령이자 외부 명령입니다. 그러나 이것이 쉘 자체에 컴파일되어 쉘 내장형이라는 사실은 바뀌지 않습니다.

관련 정보