내장 유틸리티와 외부 유틸리티를 구별하는 방법은 무엇입니까? (예: 에코)

내장 유틸리티와 외부 유틸리티를 구별하는 방법은 무엇입니까? (예: 에코)

일부 명령은 내장 명령과 외부 유틸리티로 모두 제공됩니다. 예를 들어 echo. Bash 3.2를 실행하는 내 컴퓨터(macOS)에서,

$ type echo
echo is a shell builtin

실행 중인 man bash | less --pattern='^ *echo +\['프로그램:

echo [-neE] [arg ...]

그러나 실행하면 다양한 서명을 사용하여 man 1 echo다양한 구현에 대한 매뉴얼 페이지가 표시됩니다 echo.

echo [-n] [string ...]

성공적으로 사용할 수 있었기 -e때문에 내장을 실행해야 했습니다./bin/echo

$ which echo
/bin/echo

다른 구현은 어디에 있으며 내장 기능과 외부 유틸리티(예 printf: ) 를 어떻게 구별할 수 있습니까?

업데이트/수정설명해 주신 @Gilles에게 감사드립니다. 그 증거는 푸딩에 있어요!

$ /bin/echo -e "\tabc"
-e \tabc

$ echo -e "\tabc"
        abc

답변1

명령이 내장되어 있는지 확인하려면 를 실행하세요 type.

$ type echo
echo is a shell builtin

type자체적으로 내장된 명령이므로 어떤 명령이 내장되어 있는지 알고 있습니다. (Bash에서는 내장 명령을 비활성화할 수 있으며 type내장 명령이 비활성화된 경우 해당 명령은 내장되지 않은 것으로 올바르게 보고됩니다.) type명령을 사용할 경우 명령이 실행할 모든 항목의 이름을 보고합니다. —별칭, 함수, 내장 또는 외부 명령.

which외부 명령의 위치를 ​​보고하는 외부 명령입니다. 별칭, 함수 또는 내장 함수에 대해서는 아무것도 모릅니다. 설정에 따라 올바른 외부 명령을 보고하지 않을 수도 있습니다.그냥 잊어버리고 which사용하세요type.

다음과 같은 내장 프로그램을 실행해야 합니다./bin/echo

아니요! 정의에 따르면 내장 명령은 외부 명령이 아닙니다. 다른 모든 내장 함수와 마찬가지로 내장 함수를 구현하는 코드는 내장 명령과 동일한 이름을 가진 외부 명령 에 echo있습니다 ./bin/bash/bin/echoecho

명령이 내장 명령과 외부 명령으로 모두 존재하는 경우 내장 명령은 해당 이름을 사용하여 호출됩니다. 순서대로 나열된 디렉토리에서 명령 이름의 우선 순위는 별칭, 함수, 내장 명령, 외부 명령입니다 $PATH. 어떤 이유로 외부 명령을 강제로 실행하려면 해당 명령의 전체 경로를 사용하세요.

답변2

알려진 이름(단어)

word(단어가 별칭, 함수 또는 명령에 대한 유효한 이름이라고 가정할 때) 제공하는 항목을 찾는 가장 좋은 방법은 -a다음 옵션을 사용하는 것입니다 type.

$ type -a echo
echo is a shell builtin
echo is /bin/echo

함수와 별칭도 정의된 경우 다음과 유사한 목록이 표시될 수 있습니다.

$ type -a echo
echo is aliased to `echo "A new echo"'
echo is a function
echo ()
{
    printf '%s\n' "A function echo" "$@"
}
echo is a shell builtin
echo is /bin/echo

인쇄된 순서가 우선입니다. 위에 인쇄된 목록에서 별칭이 먼저 실행됩니다. 이 함수는 alias( unalias)가 제거되면 실행됩니다. 기타 등등

예:

$ echo "test"
A function echo
A new echo
test

인용문은 일반적으로 별칭을 우회합니다.

$ \echo         # or "e"cho, "echo", 'e'"ch"o, and many other variations.
A function echo
test

이는 별칭을 설정 해제하는 것과 같습니다.

$ unalias echo; echo test
A function echo
test

이 기능은 설정 해제(옵션 -f)를 통해 제거할 수 있습니다.

$ unset -f echo 
$ type -a echo
echo is a shell builtin
echo is /bin/echo

다음을 활성화하여 별칭을 끌 수 있습니다.

$ enable -n echo
$ type -a echo
echo is /bin/echo

그리고 외부(셸 외부) 유틸리티를 이동할 수도 있습니다.

# mv /bin/echo /bin/echo-aside
# type -a echo
bash: type: echo: not found

내장 함수 목록

내장 함수의 이름을 알 수 없는 경우 나열할 수 있습니다.

enableBash에는 ( builtinin ) 이라는 이상한 이름의 명령이 있습니다 ksh. 옵션 없이
호출하면 내장 함수 목록이 enable인쇄됩니다 .enabled

$ enable
enable .
enable :
enable [
enable alias

-a모두 인쇄( ), 활성화만 활성화( -p또는 아무것도 인쇄하지 않음) 및 특수(Posix 정의) 내장( ) 옵션이 있습니다 -s.

"enable"이라는 단어를 제거하고 한 줄 목록으로 만듭니다.

$ echo $(enable -s | cut -d" " -f2)
. : break continue eval exec exit export readonly return set shift source times trap unset

$ echo $(enable -p | cut -d" " -f2)
. : [ alias bg bind break builtin caller cd command compgen complete compopt continue declare dirs disown echo enable eval exec exit export false fc fg getopts hash help history jobs kill let local logout mapfile popd printf pushd pwd read readarray readonly return set shift shopt source suspend test times trap true type typeset ulimit umask unalias unset wait

관련 정보