Bash가 환경 변수에 입력된 내용을 구문 분석/실행하는 이유는 무엇입니까?

Bash가 환경 변수에 입력된 내용을 구문 분석/실행하는 이유는 무엇입니까?

이것쉘 쇼크Bash의 버그는 환경 변수를 통해 작동합니다. 솔직히 이런 기능이 있다는게 놀랍습니다.

"환경 변수를 통해 함수 정의 전달"

따라서 이 질문은 완벽하지는 않지만 이 기능이 필요한 예나 사례를 묻는 것입니다.

추가 혜택. zsh, dash 등과 같은 다른 쉘에도 이 기능이 있습니까?

답변1

한 스크립트가 다른 스크립트를 호출하면 상위 스크립트의 변수를 내보낸 다음 하위 스크립트에서 볼 수 있습니다. 함수 내보내기는 명백한 일반화입니다. 즉, 상위에서 함수를 내보내 하위에서 볼 수 있게 만듭니다.

환경은 프로세스가 임의의 데이터를 하위 항목에 전달하는 유일한 편리한 방법입니다. 데이터는 널 바이트를 포함하지 않는 문자열로 마샬링되어야 하며 이는 쉘 함수에 어렵지 않습니다. 공유 메모리 블록이나 파일 설명자를 통해 전달된 임시 파일과 같은 다른 잠재적인 방법이 있지만 이러한 방법은 이를 어떻게 해야 할지 모르거나 닫는 중개 프로그램에 문제를 일으킬 수 있습니다. 프로그램은 자신이 알지 못하거나 신경 쓰지 않는 변수가 포함된 환경에서 실행될 것으로 예상하므로 해당 변수를 덮어쓰거나 삭제하지 않습니다.

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

함수 내보내기는 오래된 기능입니다. Bourne 쉘에 추가된 기능SVR2에서는및 내보낸 함수버전 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의 공개 도메인 복제본은 내보내기 기능을 지원하지 않습니다.

관련 정보