
쉘 에는 다음과 같은 기능이 yash
내장되어 있습니다 printf
.설명서에 따르면.
그러나 이것은 yash
기본 구성의 셸에서 볼 수 있는 것입니다.
$ command -v printf
/usr/bin/printf
$ type printf
printf: a regular built-in at /usr/bin/printf
printf
이 쉘에 내장되어 있습니까 ? 결과는 외부 명령으로도 사용할 수 있는 내장 유틸리티로 추정되는 여러 가지 경우에도 유사합니다.
비교하자면, OpenBSD의 ( pdksh
에서ksh
printf
~ 아니다내장):
$ command -v printf
/usr/bin/printf
$ type printf
printf is /usr/bin/printf
그리고 bash
(어디 에서printf
~이다내장):
$ command -v printf
printf
$ type printf
printf is a shell builtin
답변1
껍질yash
하다printf
(및 기타 유틸리티) 의 내장 버전이 있고 사용하고 있습니다 . 이는 command -v
및 type
명령 의 결과를 공식화하는 방식으로 매우 현명하게 POSIX를 준수합니다 .
mosvy 댓글처럼$PATH
, POSIX 표준 에서는 실행될 명령의 내장 버전에 대해 일반 내장 명령을 외부 명령으로 사용할 수 있어야 합니다 .
이것은표준의 관련 텍스트:
명령어 검색 및 실행
간단한 명령으로 명령 이름과 선택적 인수 목록이 생성되면 다음 작업이 수행됩니다.
명령 이름에 <슬래시> 문자가 포함되어 있지 않으면 다음 순서에 따라 첫 번째 성공적인 단계가 발생합니다.
ㅏ. 명령 이름이 특수 내장 유틸리티의 이름과 일치하는 경우 해당 특수 내장 유틸리티가 호출됩니다.
[...]
- 이자형. 그렇지 않으면 XBD 환경 변수에 설명된 대로 PATH 환경 변수를 사용하여 명령을 검색해야 합니다.
- 나.검색이 성공한 경우:
- ㅏ.시스템이 유틸리티를 일반 내장 기능이나 쉘 기능으로 구현한 경우 경로 검색의 이 시점에서 호출됩니다.
- 비. 그렇지 않으면 쉘은 별도의 유틸리티 환경에서 유틸리티를 실행합니다. [...]
[...]- ii. 검색이 실패하면 명령은 종료 상태 127로 실패하고 쉘은 오류 메시지를 작성합니다.
- 명령 이름에 <슬래시>가 하나 이상 포함된 경우 [...]
이는 의 출력이 명령을 command -v printf
의미함을 의미합니다.printf
~였다검색 경로에서 발견되는 반면, 의 출력은 type printf
명령이 일반 내장 명령이라는 것을 추가합니다.
검색경로에서 명령어 printf
를 찾았고, 쉘에 일반 내장되어 있기 때문에,yash
내장된 명령 버전을 호출합니다.. 만약 printf
에~ 아니다경로에서 발견되었으며 yash
쉘이 POSIX 수준의 올바른 모드에서 실행 중이었다면 대신 오류가 생성되었을 것입니다.
yash
POSIX와 매우 호환되는 쉘이라는 점에 자부심을 갖고 있으며, 우리가 살펴보면 이는 또한 사실입니다.POSIX가 말하는 것command -v
:
-v
현재 쉘 실행 환경에서 쉘이 사용할 경로 이름이나 명령을 나타내는 문자열을 표준 출력에 기록합니다(참조:쉘 실행 환경)를 호출하려면 을 호출
command_name
하지만 호출하지는 마십시오command_name
.
- 유용,일반 내장 유틸리티,
command_names
문자<slash>
및 변수를 사용하여 발견된 모든 구현 정의 함수PATH
(에 설명된 대로)명령어 검색 및 실행),절대 경로 이름으로 작성됩니다.
답변2
Watanabe 쉘에는 세 가지 종류의 내장 기능이 있으며 매뉴얼에 자세히 설명되어 있습니다. 모든 내장 명령도 여기에 나열되어 있지만, "일반적인" 내장 명령이 무엇인지 추론해야 합니다.결석해당 명령이 "특별" 또는 "세미 특별" 내장 명령이라고 명시되어 있습니다. 일반 내장 기능은 표시되지 않습니다.
printf
"일반적인" 내장 기능 중 하나입니다. 네이티브 모드에서는언제나해당 이름으로 찾은 외부 명령이 있는지 여부에 관계없이 호출됩니다.
$경로=/usr/bin $printf printf: 이 명령에는 피연산자가 필요합니다 $printf를 입력하세요 printf: /usr/bin/printf에 일반 내장 $ $경로=/ $printf printf: 이 명령에는 피연산자가 필요합니다 $printf를 입력하세요 printf: 일반 내장($PATH에는 없음) $
그러나 posixly-correct
쉘 옵션이 설정되면 외부 명령이 PATH
.
$--posixly-올바른 설정 $ $경로=/usr/bin $printf printf: 이 명령에는 피연산자가 필요합니다 $ $경로=/ $printf yash: 'printf' 같은 명령은 없어요 $
이는 실제로 단일 유닉스 사양(Single Unix Specifation)이 말하는 것과 일치하며 적어도 1997년부터 말해왔습니다.
이는 Z 셸, 93 Korn 셸, Bourne Again 셸 및 Debian Almquist 셸과 다르며, 이들 중 어느 것도 일반 내장에 대한 이러한 동작을 구현하거나 문서화하지 않습니다. 예를 들어 Z 쉘은 일반 내장 기능이 포함된 문서를 제공합니다.언제나설립하다,~ 전에검색하는 단계입니다 PATH
. Debian Almquist 쉘도 마찬가지입니다. sh
POSIX 옵션을 켜는 것처럼 호출하더라도 이것이 바로 이러한 쉘이 모두 수행하는 작업입니다 .
%/bin/exec -a sh zsh -c "PATH=/ ; printf 입력 ; printf" printf는 쉘 내장입니다 zsh:printf:1: 인수가 충분하지 않습니다. %/bin/exec -a sh ksh93 -c "PATH=/ ; printf 입력 ; printf" printf는 쉘 내장입니다 사용법: printf [ 옵션 ] 형식 [문자열 ...] %/bin/exec -a sh bash --posix -c "PATH=/ printf 입력 ; printf" printf는 쉘 내장입니다 printf: 사용법: printf [-v var] 형식 [인수] %/bin/exec -a sh 대시 -c "PATH=/ ; printf 입력 ; printf" printf는 쉘 내장입니다 sh: 1: printf: 사용법: printf 형식 [arg ...] %
그러나 PD Korn 쉘, Heirloom Bourne 쉘 및 MirBSD Korn 쉘의 동작은 printf
켜져 있지 않을 때 실행되지 않습니다. 애초에 내장된 PATH
기능이 없기 때문입니다 . printf
☺
%/bin/exec -a sh `명령 -v ksh` -c "PATH=/ ; printf 입력 ; printf" printf를 찾을 수 없습니다 sh: printf: 찾을 수 없음 %/bin/exec -a sh `명령 -v oksh` -c "PATH=/ ; printf 입력 ; printf" printf를 찾을 수 없습니다 sh: printf: 찾을 수 없음 %/bin/exec -a sh `명령 -v jsh` -c "PATH=/ ; printf 입력 ; printf" printf를 찾을 수 없습니다 sh: printf: 찾을 수 없음 %/bin/exec -a sh mksh -c "PATH=/ ; printf 입력 ; printf" printf를 찾을 수 없습니다 sh: printf: 찾을 수 없음 %ksh -c "printf 입력 ; printf" printf는 /usr/bin/printf에 대해 추적된 별칭입니다. 사용법: printf 형식 [인수 ...] %oksh -c "printf 입력 ; printf" printf는 /usr/bin/printf에 대해 추적된 별칭입니다. 사용법: printf 형식 [인수 ...] %jsh -c "printf 입력 ; printf" printf가 해시되었습니다(/usr/bin/printf). 사용법: printf 형식 [인수 ...] %mksh -c "printf 입력 ; printf" printf는 /usr/bin/printf에 대해 추적된 별칭입니다. 사용법: printf 형식 [인수 ...] $