POSIX가 외부 구현을 위해 특정 쉘 내장을 요구하는 이유는 무엇입니까?


18

에서 의 printf인지에 대한이 질문에 A는 YASH에 내장- , 제공 이 답변이 따옴표 POSIX 표준을 .

대답은 POSIX 검색 순서가 원하는 명령의 외부 구현을 찾은 다음 쉘이 내장 명령으로 구현 한 경우 내장을 실행한다는 것입니다. ( 특별한 내장 이 아닌 내장의 경우 )

내부 구현을 실행하기 전에 POSIX에 외부 구현이 존재해야하는 이유는 무엇입니까?

그것은 ... 임의의 것 같아서 궁금합니다.


나는 그것이 원하거나 필요하다면 내장을 활성화 / 비활성화하는 방법이라고 생각합니다.
이삭

2
외부 구현을 제거하여 내장 기능을 비활성화 하시겠습니까? 현재 printf사용 가능한 이름의 명령이 없습니다.
studog

@studog이므로 내장 파일과 동일한 이름으로 빈 파일을 만들고 실행 비트를 켜고 PATH의 디렉토리에 넣으십시오. : P
와일드 카드

@Wildcard 엄격하게 호환되는 셸은 PATH외부 스크립트가 아닌 내장 유틸리티 를 검색하는 동안 이름을 확인한 다음 내장 유틸리티를 호출합니다. 경로에서 외부 스크립트를 호출하려면 어떻게합니까? 흠 ... 이것은 다른 가능성을 설명하는 테이블을 요구하는 것 같습니다. 이 하나 여기 , 그러나 그것은 나에게 이해가되지 않습니다.
Kusalananda

@ Kusalananda, 첫 번째 문장을 다시 말씀 드렸습니다. 따라서 파일 을 만들라고 말한 이유는 무엇입니까?
와일드 카드

답변:


15

이것은 "있는 것처럼"규칙입니다.

간단히 말해 : 구현에서 표준 외부 명령을 셸 내장으로도 사용하기로 결정한 경우 사용자가 볼 때 셸의 동작은 변경되지 않아야합니다.

PD Korn, MirBSD Korn 및 Heirloom Bourne 쉘의 동작 사이 에서 /unix//a/496291/5132 에서 보여준 대조 ; (반면) Z, 93 Korn, Bourne Again 및 Debian Almquist 포탄; 와타나베 껍질은 이것을 강조합니다.

이없는 쉘의 경우 printf와 같은 내장, 제거 /usr/bin에서하는 PATH의 호출하게 printf정지 작업을. Watanabe 쉘이 준수 모드로 표시 한 POSIX 준수 동작은 동일한 결과를 발생시킵니다. printf내장 된 쉘의 동작은 마치 외부 명령을 호출하는 것과 같습니다 .

부적합한 모든 쉘의 동작 /usr/bin은에서 제거 된 경우 변경되지 않으며 외부 명령을 호출하는 것처럼 동작 PATH하지 않습니다 .

표준이 보증하려고하는 것은 쉘이 모든 종류의 일반적으로 외부 명령을 내장하거나 자체 쉘 함수로 구현할 수 있다는 것입니다. PATH명령이 발견되지 않도록 조정 하는 경우 외부 명령을 사용하십시오 . PATH호출 할 수있는 명령을 선택하고 제어하기위한 도구로 남아 있습니다.

( /unix//a/448799/5132 에서 설명했듯이 사람들은 몇 년 전 사람들이 무엇이 바뀌 었는지 변경하여 유닉스의 성격을 선택했습니다 PATH.)

명령을 찾을 수 있는지 여부에 관계없이 항상 명령이 작동하도록 하는 PATH 것은 실제로는 일반적으로 외부 명령을 내장하는 것입니다. (이것이 내 nosh 툴셋 printenv이 사실 버전 1.38에서 내장 명령을 얻은 이유입니다. 이것은 쉘 이 아닙니다 .)

그러나 표준은 쉘에서 제공 되지 않는 일반 외부 명령에 대해 동일한PATH 쉘이 아닌 다른 프로그램에서 execvpe()함수 를 호출하는 것과 동일한 동작을 보이며 쉘이 마술처럼 할 수 없다는 것을 보증합니다 다른 프로그램이 동일하게 찾을 수없는 일반 외부 명령을 실행하십시오 PATH. 모든 것이 사용자의 관점에서 일관되게 PATH작동하며 작동 방식을 제어하는 ​​도구입니다.

추가 자료


13

그것은 터무니없고 셸이 기본 모드로 구현되지 않는 이유입니다.

이 표준의 근거 와 설명 예는 이것이 가지고있는 것이지 시도였다 제안 정기적으로 자신의 바이너리에 출두함으로써 사용자 오버라이드에게 그것을 경로와 연관된 및하자에 내장 PATH(예. printf내장과 관련을 ) 을 설정 /usr/bin/printf하여 /foo/bin/printf외부 명령 으로 재정의 할 수 있습니다 PATH=/foo/bin:$PATH.

그러나 표준은 그것을 요구하지 않았지만 완전히 다른 것 (그리고 쓸모없고 예상치 못한 것)을 가져 왔습니다.

버그 보고서 에서 자세한 내용을 확인할 수 있습니다 . 최종 승인 된 텍스트 에서 인용 :

기존의 많은 구현은 PATH 검색을 수행하지 않고 일반 내장 기능을 실행합니다. 이 동작은 표준 텍스트와 일치하지 않으며 스크립트 작성자가 특수하게 조작 된 PATH를 통해 일반 내장 유틸리티를 무시할 수 없습니다. 또한, 이론적 근거는 저자가 PATH를 수정하여 내장 기능 을 무시하도록하는 것이지만 이것이 표준 텍스트가 말하는 것은 아닙니다 .

FWIW, 나는 수락 된 텍스트에서 수정 된 요구 사항을 구현하는 쉘이 없다고 생각합니다.




아니요. (예 : / usr / bin / printf와 관련된 printf 내장은 PATH = / foo / bin : $ PATH를 설정하여 / foo / bin / printf external 명령으로 재정의 될 수 있습니다). 잘못되었습니다. PATH 에 /usr/bin/printf또는 둘 다 또는 /foo/bin/printfPATH에 존재 하면 내장 printf 가 활성화됩니다 . 누락 된 (PATH에서) 외부 printf가 수행 하는 유일한 작업은 내장 기능을 비활성화하는 것입니다. ( 사양 의 문자 로).
아이작
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.