에서배쉬 매뉴얼, 말한다
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
보시다시피, [
이는 다양한 다른 쉘 내장 기능과 마찬가지로 내장 명령이자 외부 명령입니다. 그러나 이것이 쉘 자체에 컴파일되어 쉘 내장형이라는 사실은 바뀌지 않습니다.