`env var=value`가 var에 모든 이름을 허용하는 이유는 무엇입니까?

`env var=value`가 var에 모든 이름을 허용하는 이유는 무엇입니까?

읽다env POSIX 문서:

어떤 사람들은 다음과 같은 방법으로 동일한 효과를 얻을 수 있기 때문에 env가 중복된다고 생각합니다.

이름=값...유틸리티[매개변수...]

이 예는 환경 변수가 명령 환경에 추가될 때 env와 동일하지만 환경이 지정된 값으로 설정된 경우에는 해당되지 않습니다. 인수 없이 호출되면 env 유틸리티는 현재 환경도 기록합니다. env를 포함하는 것을 정당화하기 위해 예제에서 제공하는 것 이상의 기능이 충분합니다.

AFAICT, as를 사용할 때 위 문장의 의미는 var=value command동일하지만 동일하지는 않습니다.env var="value" commandenv -i var="value" command

이제 적어도 envGNU 시스템, FreeBSD 및 Solaris 11의 구현 에서는 env이름의 합계를 제외한 모든 문자가 허용되므로 동일하지 않다는 것을 깨달았습니다 =.\0var

$ env 'BASH_FUNC_foo%%=() { echo foo; }' bash -c foo

인쇄부자, 비록 유효한 변수 이름이 아니기 BASH_FUNC_foo%%='() { echo foo; }'때문에 어떤 쉘에서도 사용할 수는 없습니다 .BASH_FUNC_foo%%

POSIX 셸에서는 를 제외하고 셸이 액세스할 수 없는 bash환경 변수에 이름이 지정된 변수가 남습니다 .BASH_FUNC_foo%%

그렇다면 형식에 임의의 이름을 허용하는 목적은 무엇입니까 env var=value? POSIX가 이것을 허용합니까?

답변1

그렇다면 형식에 임의의 이름을 허용하는 목적은 무엇입니까 env var=value? POSIX가 이것을 허용합니까?

에서 인용POSIX: 환경 변수:

POSIX.1-2008 셸 및 유틸리티 볼륨에서 유틸리티가 사용하는 환경 변수 이름은 대문자, 숫자, 이식 가능한 문자 집합에 정의된 문자( '_' )로만 구성되며 숫자로 시작하지 않습니다. 구현에서는 다른 문자를 허용할 수 있습니다(MAY). 애플리케이션은 그러한 이름의 존재를 허용해야 합니다.

참고: 다른 응용 프로그램에서는 숫자로 시작하는 환경 변수 이름을 처리하는 데 어려움이 있을 수 있습니다. 따라서 이러한 이름은 어디에서나 사용하지 않는 것이 좋습니다.

따라서 구현에서는 env임의의 환경 변수 이름을 허용할 수 있으며 대부분의 구현에서는 NUL이 아닌 모든 문자를 왼쪽에 허용하고 '='다른 유틸리티(예: 쉘)의 구현에서는 임의의 환경 변수 이름을 허용하거나 허용하지 않을 수 있습니다. 환경 변수 이름이 허용됩니다.

name=value ... utility동일한 설명은 구현과 셸 모두에서 이를 환경 변수로 허용하는 경우에만 적용됩니다.env var="value" utilityenvname

Austin Group은 이 문제에 대한 흥미로운 게시물을 게시했습니다.환경에서 잘못된 셸 할당. 언급된 한 가지 점은 쉘은 일반적으로 이름이 쉘 변수로 표시될 수 있는 환경 변수만 허용한다는 것입니다. 이 스레드의 여러 참가자가 unix.stackexchange.com에 참여했으며 문제에 대한 더 많은 정보를 추가할 수 있기를 바랍니다.

답변2

당신은 진지하게, env쉘에 유효하지 않을 수 있는 환경에 물건을 넣을 수 있습니다. 나는 이 사실이 env별도의 프로그램이고 환경이 쉘이 허용하는 것에 제한되지 않기 때문에 문제가 없다고 생각합니다 shell variables.

결과를 자세히 살펴보면 일반 쉘은 쉘 변수에 접근할 수 없게 되는 방식으로 동작하지 않는다는 것을 알 수 있습니다.

  • Bourne Shell은 그러한 변수를 전혀 가져오거나 전파하지 않습니다.

  • ksh(ksh88 이후의 모든 버전) 및 zsh는 환경에만 변수를 유지하고 셸 변수 목록에 전파하지 않습니다.

유일한 문제가 되는 쉘은 bash환경을 쉘 변수 목록으로 가져오지만 관련 쉘 변수에 대한 액세스를 허용하지 않기 때문인 것 같습니다.

Bash에 대한 버그 보고서를 제출하는 것이 좋습니다.

관련 정보