yash 쉘의 printf가 내장 명령인지 약간 혼란스럽습니다.

yash 쉘의 printf가 내장 명령인지 약간 혼란스럽습니다.

하우징에는 내장형이 yash있으며 printf,그 매뉴얼에 따르면.

그러나 yash기본 구성된 셸에는 다음과 같은 내용이 표시됩니다.

$ command -v printf
/usr/bin/printf
$ type printf
printf: a regular built-in at /usr/bin/printf

이 쉘에 내장된 것이 있나요 printf? 결과는 외부 명령으로도 사용할 수 있는 소위 내장 유틸리티의 경우에도 유사합니다.

비교를 위해 OpenBSD pdksh( 여기서kshprintf아니요내장):

$ 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방식에서 POSIX 표준을 매우 현학적으로 준수 합니다 type.

대부분의 댓글처럼$PATH, POSIX 표준 에서는 실행할 명령의 내장 버전에 대한 외부 명령 으로 일반 내장 명령을 사용할 수 있어야 합니다 .

이것은표준의 관련 텍스트:

명령어 검색 및 실행

간단한 명령이 명령 이름과 선택적 인수 목록을 생성하는 경우 다음을 수행해야 합니다.

  1. 명령 이름에 <슬래시> 문자가 포함되어 있지 않으면 첫 번째 성공적인 단계를 다음 순서로 수행해야 합니다.

    • ㅏ. 명령 이름이 특수 내장 유틸리티의 이름과 일치하는 경우 특수 내장 유틸리티를 호출해야 합니다.

      [...]

    • e. 그렇지 않으면 XBD 환경 변수에 설명된 대로 PATH 환경 변수를 사용하여 명령을 검색해야 합니다.
      • 나.검색이 성공한 경우:
        • ㅏ.시스템이 유틸리티를 일반 내장 또는 쉘 함수로 구현한 경우 경로 검색의 이 시점에서 호출해야 합니다.
        • b. 그렇지 않으면 쉘은 별도의 유틸리티 환경에서 유틸리티를 실행합니다. [...]
          [...]
      • 2. 검색이 실패하면 명령은 종료 상태 127로 실패하고 쉘은 오류 메시지를 기록합니다.
  2. 명령 이름에 <슬래시>가 하나 이상 포함된 경우 [...]

이는 명령 의 출력이 다음을 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: /usr/bin/printf에 일반 내장 함수
$
$경로=/
$인쇄 기능
printf: 이 명령에는 피연산자가 필요합니다.
$활자 인쇄하다
printf: 일반 내장 함수($PATH에는 없음)
$

그러나 posixly-correct셸 옵션을 설정할 때 PATH.

$--posixly-올바른 설정
$
$경로=/usr/bin
$인쇄 기능
printf: 이 명령에는 피연산자가 필요합니다.
$
$경로=/
$인쇄 기능
yash: 'printf' 같은 명령은 없어요
$

이는 실제로 Single Unix 사양의 요구 사항이며 적어도 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 형식 [매개변수...]
$

관련 정보