bash가 환경 변수에 파싱 / 실행 항목을 넣는 이유는 무엇입니까? 나는 다음과 같은 기능이 있다는 사실에 놀랐습니다. “env

bash 의 shellshock 버그는 환경 변수를 통해 작동합니다. 솔직히 나는 다음과 같은 기능이 있다는 사실에 놀랐습니다.

“env vars를 통한 함수 정의 전달”

따라서이 질문은 완벽하게 공식화되지는 않았지만이 기능을 사용해야하는 예 또는 사례를 묻는 것입니까?

보너스. 다른 쉘 zsh, dash 등에 도이 기능이 있습니까?



답변

스크립트가 다른 스크립트를 호출하면 부모 스크립트의 변수를 내보내고 자식 스크립트에서 볼 수 있습니다. 함수 내보내기는 명백한 일반화입니다. 부모에서 함수를 내보내고 자식에서 볼 수있게하십시오.

환경은 프로세스가 임의의 데이터를 자식에게 전달할 수있는 유일한 편리한 방법입니다. 널 바이트를 포함하지 않는 문자열로 데이터를 마샬링해야하므로 쉘 기능에는 어려움이 없습니다. 공유 메모리 블록 또는 파일 디스크립터를 통해 전달 된 임시 파일과 같은 다른 잠재적 인 방법이 있지만, 이로 인해 수행 할 작업을 모르거나 닫는 중간 프로그램에 문제가 발생할 수 있습니다. 프로그램은 알지 못하거나 신경 쓰지 않는 변수가 포함 된 환경에서 실행되므로 덮어 쓰거나 지우지 않습니다.

함수 이름을 환경 변수의 이름으로 사용하는 것은 이상한 일입니다. 우선, 내 보낸 변수가 같은 이름의 내 보낸 함수와 충돌한다는 것을 의미합니다.

내 보낸 기능은 이전 기능입니다. SVR2 의 Bourne 쉘 함수가 추가되었고 같은 해에 릴리스 된 버전 8 쉘 (1984) 에서 함수를 내보냈습니다 . 이 셸에서 변수와 함수는 동일한 네임 스페이스를 사용했습니다. 함수 내보내기가 어떻게 작동했는지 모르겠습니다. 가보 쉘 기능을 가지고 있지만를 내 보내지 않는 Bourne의 변형을 기반으로한다.

ATT ksh는 아마도 함수 내보내기를 지원하지만 소스를 보거나 재생하는 것은 ksh93u에서 볼 수 없습니다.

env -i /usr/bin/ksh -c 'f=variable; f () { echo function; }; typeset -fx f; /usr/bin/env; ksh -c f'
_=*25182*/usr/bin/env
PWD=/home/gilles
SHLVL=1
A__z="*SHLVL
ksh: f: not found

Ksh의 퍼블릭 도메인 클론 (pdksh, mksh), dash 및 zsh는 내보내기 기능을 지원하지 않습니다.


답변