예
$ 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 명령은 다음과 같을 수 있습니다.
- 별칭 또는
- 쉘 기능 또는
- 쉘에 내장된 유틸리티, 또는
- 외부 유틸리티(컴파일된 바이너리 또는 스크립트 언어로 작성된 스크립트).
일부 "명령"은 명령이 아니라 for
및 if
등과 같은 키워드입니다. 이는 더욱 흥미로운 쉘 경험을 위해 별칭과 쉘 함수로 대체될 수도 있습니다(즉, 이렇게 하지 마십시오).