함수는 bash/shell 스크립팅 언어에 내장된 명령과 동일합니까?

함수는 bash/shell 스크립팅 언어에 내장된 명령과 동일합니까?

$ echo "This is great"
This is great
$ num2=2
$ num3="Three"
$ echo $num2
2
$ echo $num3
Three

에코를 재정의합니다.

$ echo(){ command echo "The command was redefined"; }
$ echo $num2
The command was redefined
$ echo $?
The command was redefined

그렇다면 이것이 사실인가요? Unix 쉘의 모든 명령을 실행할 수 있고 이와 같이 작동할 수 있습니까?

답변1

아니요. 내장 기능은 함수와 동일한 네임스페이스를 통해 액세스할 수 있지만 여전히 별도의 엔터티이며 builtin함수에 의해 숨겨지더라도 내장 명령을 통해 액세스할 수 있습니다(물론 재미를 더하기 위해 재정의할 수도 있습니다 builtin☺). 또한 unset -f echo내장 기능을 원래 상태로 되돌리면 주의하세요 .

이름에서 알 수 있듯이 내장 함수도 내장되어 파일에서 생성된 C 코드(bash의 경우)로 구현됩니다.echo.def.

답변2

아니요, 모든 Unix 명령은 쉘 기능이 아니지만 쉘 기능으로 대체될 수 있습니다.

쉘 함수 이름은 내장 또는 외부 유틸리티 이름으로 제한되지 않습니다. 서로 다른 경로에 동일한 이름을 가진 여러 외부 유틸리티가 있을 수 있는 것처럼 동일한 이름을 가진 셸 함수나 별칭이 있을 수도 있습니다.

함수가 호출 foo되고 외부 또는 내장 유틸리티도 호출되면 foo해당 함수가 호출됩니다.foo

쉘이 내장 유틸리티를 선택하도록 하려면 다음을 사용하십시오.

builtin foo

이 기능을 사용하지 않으려면 foo다음을 사용하십시오.

command foo

쉘 함수, 별칭 또는 내장 유틸리티 대신 외부 유틸리티가 사용되도록 하려면 전체 경로를 사용하십시오. 예를 들면 다음과 같습니다.

/bin/echo

별칭과 함수는 동일한 네임스페이스를 차지하므로 별칭과 함수는 같은 이름을 가질 수 없습니다.


간단히 말해서:

Unix 명령은 다음과 같을 수 있습니다.

  • 별칭 또는
  • 쉘 기능 또는
  • 쉘에 내장된 유틸리티, 또는
  • 외부 유틸리티(컴파일된 바이너리 또는 스크립트 언어로 작성된 스크립트).

일부 "명령"은 명령이 아니라 forif등과 같은 키워드입니다. 이는 더욱 흥미로운 쉘 경험을 위해 별칭과 쉘 함수로 대체될 수도 있습니다(즉, 이렇게 하지 마십시오).

관련 정보