[linux] Linux 환경 변수 이름에서 허용되는 문자

Linux 환경 변수 이름에는 어떤 문자가 허용됩니까? 맨 페이지와 웹을 커서로 검색하면 변수 작업 방법에 대한 정보 만 생성되었지만 어떤 이름은 허용되지 않습니다.

점과 같은 정의 된 환경 변수가 필요한 Java 프로그램이 com.example.fancyproperty있습니다. Windows에서는 해당 변수를 설정할 수 있지만 Linux (SuSE 및 Ubuntu에서 시도)에서 변수를 설정하는 것은 운이 없었습니다. 그 변수 이름도 허용됩니까?



답변

에서 사용되는 The Open Group :

이 문자열은 name = value 형식입니다. 이름은 문자 ‘=’를 포함 할 수 없습니다. IEEE Std 1003.1-2001을 준수하는 시스템에서 값을 이식 할 수 있으려면 값을 이식 가능한 문자 세트의 문자로 구성해야합니다 ( NUL 제외 및 아래에 표시된대로 ).

따라서 이름에는 = 및 NUL을 제외한 모든 문자가 포함될 수 있지만

IEEE Std 1003.1-2001의 쉘 및 유틸리티 볼륨에서 유틸리티가 사용하는 환경 변수 이름은 대문자, 숫자 및 휴대용 문자 세트에 정의 된 문자 의 ‘_'(밑줄)로만 구성되며 숫자로 시작하지 않습니다 . 구현시 다른 문자가 허용 될 수 있습니다. 응용 프로그램은 그러한 이름의 존재를 용인해야합니다.

따라서 이름은 유효하지만 쉘은 문자, 숫자 및 밑줄 이외의 것을 지원하지 않을 수 있습니다.


답변

IEEE Std 1003.1-2008 / IEEE POSIX P1003.2 / ISO 9945.2의
쉘 섹션에있는 POSIX 표준
쉘 및 도구 표준은 변수 이름에 대한 어휘 규칙을 정의하지 않지만
소스를 살펴보면 다음과 유사한 것을 사용합니다.

[a-zA-Z_]+[a-zA-Z0-9_]*

(편집 : 두 번째 문자 클래스에 누락 된 밑줄이 추가되었습니다.)

일부 쉘은 정규식에서 +를 지원하지 않으므로 잠재적으로 더 이식 가능한 정규식은 다음과 같습니다.

[a-zA-Z_]{1,}[a-zA-Z0-9_]{0,}


답변

내 빠른 테스트는 기본적으로 C 변수 이름과 동일한 규칙, 즉

  1. az, AZ _및 0-9
  2. 숫자로 시작할 수 없습니다

따라서 이것은 .내부를 제외 합니다. 불법 변수 이름은로 인정됩니다 unknown command.

이것은 주로 BASH 호환 ZSH에서 테스트되었습니다.


답변

‘허용’이라는 말의 의미에 따라 다릅니다.

nonce에 대한 Windows 무시 :

환경은 문자열 배열이며 프로그램의 주요 기능으로 전달됩니다. execve (2)를 읽으면 null 종료 이외의 문자열에 대한 요구 사항이나 제한이 없습니다.

일반적으로 각 문자열은 NAME = value로 구성됩니다. 인용 규칙이 없으므로이 규칙에서 이름에 ‘=’를 사용할 수 없습니다.

보통의 사람들은이 끈을 조개 껍질로 토론하여이 끈을 설정합니다. 각 쉘에는 유효한 변수 NAME이 무엇인지에 대한 자체 아이디어가 있으므로 쉘의 생각을 보려면 쉘 페이지의 맨 페이지를 읽어야합니다.

일반적으로 com.baseball.spit = fleagh와 같은 것은 Java 시스템 특성이며 일부 Java 프로그램이 환경으로 되돌아 갈 것인지의 여부에 관계없이 -D로 지정하는 것이 좋습니다.


답변

껍질에 따라 다릅니다. 기본적으로 bash를 사용하고 있다고 생각합니다.이 경우 문자, 숫자 및 밑줄이 허용되지만 변수 이름을 숫자로 시작할 수 없습니다. Bash v.3부터 변수 이름 내에 마침표를 사용할 수 없습니다 .


답변

그렇습니다, 당신은 그것을 할 수 있습니다.

이 장면을 구현 하려면 execenv명령을 사용하십시오 .

Docker의 테스트 픽스처

docker run -it --rm alpine:3.10

컨테이너에서 명령을 실행하십시오.

exec env spring.application_name=happy-variable-name ${SHELL:-/bin/sh}

환경 변수를 확인하십시오.

HOSTNAME=bd0bccfdc53b
SHLVL=2
HOME=/root
spring.application_name=happy-variable-name
TERM=xterm
PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
PWD=/

ps auxPID가 변경되지 않았는지 확인하는 데 사용

PID   USER     TIME  COMMAND
    1 root      0:00 /bin/sh
   12 root      0:00 ps aux

python환경 변수 확인에 사용

apk add python
python -c 'import os; print(os.environ["spring.application_name"])'

출력은 happy-variable-name입니다.

무슨 일이야?

  1. 쉘 호출 내장 exec
  2. 셸 내장 exec 호출 syscall.exec는 현재 셸을 대체하는 프로세스 ‘env’를 만듭니다.
  3. env 프로세스 호출 syscall.execvp env 프로세스를 대체하는 프로세스 ‘/ bin / sh’작성

또 다른 방법

  • 도커 이미지

docker를 사용하는 경우 Dockerfile에서 변수를 설정할 수 있습니다

FROM busybox
ENV xx.f%^&*()$#ff=1234
  • 쿠 버네 티스 구성 맵

kubernetes를 사용하는 경우 ConfigMap으로 변수를 설정할 수 있습니다

test.yaml

apiVersion: v1
kind: ConfigMap
metadata:
  name: foo-config
data:
  "xx.ff-bar": "1234"

---
apiVersion: v1
kind: Pod
metadata:
  name: foobar
spec:
  containers:
    - name: test-container
      image: k8s.gcr.io/busybox
      command: [ "/bin/sh", "-c", "env" ]
      envFrom:
      - configMapRef:
          name: foo-config
  restartPolicy: Never

포드 배포 kubectl apply -f test.yaml

kubectl logs foobar출력 확인 :

xx.ff-bar=1234

ConfigMap은 ‘-‘, ‘_’또는 ‘.’을 허용합니다.


답변

대부분의 쉘은 환경 변수 설정을 허용하지 않지만 (다른 답변에서 언급했듯이) 필요하다면을 사용하여 비표준 환경 변수로 다른 프로그램을 실행할 수 있습니다 env(1).

예를 들어, 모든 환경을 지우고 Strange.Env:Varvalue를 value로 설정 하고 foo이를 인쇄하는 perl 프로그램을 실행하십시오.

env -i Strange.Env:Var=foo perl -MData::Dumper -E 'say Dumper(\%ENV)'

인쇄합니다

$VAR1 = {
          'Strange.Env:Var' => 'foo'
        };