yash 쉘의 printf가 내장 명령인지 아닌지에 대해 약간 혼란


14

yash쉘은이 한 printf내장, 그것의 설명서에 따라 .

그러나 이것은 yash기본 구성을 가진 쉘 에서 볼 수 있습니다.

kk@eeyore ~ $ command -v printf
/usr/bin/printf
kk@eeyore ~ $ type printf
printf: a regular built-in at /usr/bin/printf

되어 printfa는 내장이 쉘이나하지? 결과는 외부 명령으로도 사용할 수있는 다른 내장 유틸리티와 유사합니다.

의 비교로서 pdksh( ksh오픈 BSD에 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
그것은의 내장 - 일반 아닌 특수 내장. 당신의 차이에 대해 혼동하는 경우 특별일반 표준에 의해 위임 된 내장 기능, 또는 행동 (참조 명령 검색 및 실행 1.eia을) - 바이너리가 존재해야 함을 요구하는 PATH순서에 정규 내장 처형 될 수 있습니다. 그런 다음 질문을하십시오.
mosvy

1
@mosvy 이것은 나에게 알려지지 않은 표준의 세부 사항이었습니다. 당신이 대답으로 바꾸고 싶다면, 나는 행복 할 것입니다. 나는이 특정 세부 사항을 알지 못했기 때문에이 질문에 대한 적절한 대답이되도록 질문을 업데이트해야한다고 생각하지 않습니다. 아니면 나중에 직접 쓸게요.
Kusalananda

답변:


14

yash쉘은 않습니다 , 그리고 사용의 내장 버전 않습니다 printf(및 기타 유틸리티). 그것은 command -vtype명령 의 결과를 공식화하는 방식으로 POSIX를 준수 합니다.

mosvy 의견 에서처럼 POSIX 표준에서는 기본 제공 $PATH버전의 명령을 실행 하려면 일반 내장 명령을 외부 명령으로 사용할 수 있어야합니다 .

이것은 표준의 관련 텍스트입니다 .

명령 검색 및 실행

간단한 명령으로 명령 이름과 선택적 인수 목록이 생성되면 다음 작업을 수행해야합니다.

  1. 명령 이름에 <slash> 문자가 포함되어 있지 않으면 다음 순서의 첫 번째 성공 단계가 발생합니다.

    • ㅏ. 명령 이름이 특수 내장 유틸리티의 이름과 일치하면 해당 특수 내장 유틸리티가 호출됩니다.

      [...]

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

이는 출력이 검색 경로에서 명령 찾았 command -v printf음 을 의미하는 반면, 출력은 명령이 기본적으로 내장되어 있음을 의미합니다.printftype printf

때문에 printf명령이 검색 경로에서 발견되었다 그것은 이후 정규 내장 쉘, yash호출 내장 된 명령의 버전 . 이 경우 printf하지 경로에, 그리고 경우 yash쉘은 POSIX-LY 올바른 모드에서 실행 된 오류 대신 생성 된 것입니다.

yashPOSIX 호환 쉘이라는 자부심을 가지고 있으며 POSIX가 말하는command -v 것을 살펴보면 다음과 같습니다.

-v

셸에서 현재 셸 실행 환경 ( Shell Execution Environment 참조 )에서 호출 할 경로 이름 또는 명령을 나타내는 문자열을 표준 출력 command_name에 기록하지만 호출하지는 않습니다 command_name.

  • 유틸리티, 일반 내장 유틸리티 , command_names을 포함하여 <slash>문자 및 사용하여 발견 된 구현 정의 함수 PATH(같은 설명 변수 명령 검색 및 실행 ), 절대 경로 이름으로 작성해야한다 .

3
내장 명령을 실행하기 전에 POSIX에 외부 명령이 있어야하는 이유를 아는 사람이 있습니까?
studog 2012 년

@studog이 질문 및 / 또는 질문을 참조하여 별도의 새로운 질문으로 질문 할 수도 있습니다.
Kusalananda


6

Watanabe 쉘에는 세 가지 종류의 내장 기능이 있으며 설명서에 자세히 설명되어 있습니다. 모든 내장 명령도 여기에 나열되어 있지만 명령이 "특별"또는 "반 특별"이라는 메모 가 없으면 "정규"내장 명령이라고 추론해야합니다. 내장. 일반 내장은 표시되어 있지 않습니다.

printf"정규적인"내장 기능 중 하나입니다. 기본 모드에서는 해당 이름으로 찾은 외부 명령이 있는지 여부에 관계없이 항상 호출됩니다.

$ 경로 = / usr / bin 
$ printf
printf :이 명령에는 피연산자가 필요합니다
$ 유형 printf
printf : / usr / bin / printf의 일반 내장
$
$ 경로 = / 
$ printf
printf :이 명령에는 피연산자가 필요합니다
$ 유형 printf
printf : 일반 내장 ($ PATH에 없음)
$

그러나 posixly-correct쉘 옵션이 설정되면 외부 명령이에서 찾을 수있는 경우에만 내장 옵션입니다 PATH.

$ set-정확하게 수정
$
$ 경로 = / usr / bin 
$ printf
printf :이 명령에는 피연산자가 필요합니다
$
$ 경로 = / 
$ printf
yash : 그런 명령은 없다`printf '
$

이것은 실제로 Single Unix Specifiation의 말과 일치하며 적어도 1997 년 이래로 말한 바 있습니다.

Z 쉘, 93 Korn 쉘, Bourne Again 쉘 및 Debian Almquist 쉘과는 다르며, 일반적인 빌트인에 대해서는 이러한 동작을 구현하거나 문서화하지 않습니다. 는 Z 쉘은, 예를 들어, 문서는 정기적으로 내장 기능이 있는지 항상 발견 하기 전에 검색하는 단계 PATH. Debian Almquist 쉘도 마찬가지입니다. 그리고 이것이 shPOS (on-on-POSIX) 옵션과 같이 호출 되더라도 이러한 쉘이 모두 수행하는 작업 입니다.

% / bin / exec -a sh zsh -c "PATH = /; type printf; printf"
printf는 쉘 내장
zsh : printf : 1 : 인수가 충분하지 않습니다
% / bin / exec -a sh ksh93 -c "PATH = /; type printf; printf"
printf는 쉘 내장
사용법 : printf [옵션] 형식 [문자열 ...]
% / bin / exec -a sh bash --posix -c "PATH = / type printf; printf"
printf는 쉘 내장
printf : 사용법 : printf [-v var] 형식 [인수]
% / bin / exec -a sh dash -c "PATH = /; type printf; printf"
printf는 쉘 내장
sh : 1 : printf : 사용법 : printf 형식 [arg ...]
% 

그러나 printf켜져 있지 않으면 PATHPD Korn 쉘, Heirloom Bourne 쉘 및 MirBSD Korn 쉘의 동작 이 실행 되지 않습니다 . printf처음부터 내장되어 있지 않기 때문 입니다. ☺

% / bin / exec -a sh`명령 -v ksh` -c "PATH = /; type printf; printf"
printf를 찾을 수 없습니다
sh : printf : 찾을 수 없음
% / bin / exec -a sh`명령 -v oksh` -c "PATH = /; type printf; printf"
printf를 찾을 수 없습니다
sh : printf : 찾을 수 없음
% / bin / exec -a sh`명령 -v jsh` -c "PATH = /; type printf; printf"
printf를 찾을 수 없습니다
sh : printf : 찾을 수 없음
% / bin / exec -a sh mksh -c "PATH = /; type printf; printf"
printf를 찾을 수 없습니다
sh : printf : 찾을 수 없음
% ksh -c "type printf; printf"
printf는 / usr / bin / printf의 추적 별명입니다.
사용법 : printf 형식 [인수 ...]
% oksh -c "type printf; printf"
printf는 / usr / bin / printf의 추적 별명입니다.
사용법 : printf 형식 [인수 ...]
% jsh -c "type printf; printf"
printf가 해시됩니다 (/ usr / bin / printf)
사용법 : printf 형식 [인수 ...]
% mksh -c "type printf; printf"
printf는 / usr / bin / printf의 추적 별명입니다.
사용법 : printf 형식 [인수 ...]
$

좋은! 확인하고 쉘 특정 비트를 내 지식에 추가해 주셔서 감사합니다! 나는이 껍질을 더 좋아한다.
Kusalananda

-1

문구가 향상 될 수 있습니다.

쉘이 posix 모드 인 경우 : set --posixly-correct :

PATH에 존재하지 않는 일반 내장 기능의 경우 다음과 같이 인쇄됩니다.

pushd: a regular built-in (not found in $PATH)

명확한 설명입니다. 기본 제공이지만 PATH에 동일한 이름을 가진 실행 파일이 없습니다.

그러나 PATH에 이름이있는 일반 내장 기능의 경우 다음과 같이 인쇄됩니다.

echo: a regular built-in at /bin/echo

이것은 / bin / echo의 실행 파일이 실행될 것임을 의미하는 것 같습니다. 에서 at로 변경하는 것이 좋습니다 also found in PATH at.

echo: a regular built-in also found in PATH at /bin/echo

더 나은 설명을 만들 것입니다. 어쩌면 (다른 대답처럼) 괄호로 묶는 것이 더 나을 수 있습니다.


POSIX 모드에서 정기적 인 내장이 작동하지 않습니다 하지 않는 한 그것이 또한 경로에.

그러나 두 가지 (POSIX) 특수 :

break colon continue dot eval exec exit export
readonly return set shift times trap unset

그리고 yash의 세미 스페셜 (POSIX에는 특별하지 않음) :

alias bg cd command false fc fg getopts jobs
kill pwd read true umask unalias wait

내장은 여전히 ​​작동합니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.