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 변수 이름과 동일한 규칙, 즉
- az, AZ
_
및 0-9 - 숫자로 시작할 수 없습니다
따라서 이것은 .
내부를 제외 합니다. 불법 변수 이름은로 인정됩니다 unknown command
.
이것은 주로 BASH 호환 ZSH에서 테스트되었습니다.
답변
‘허용’이라는 말의 의미에 따라 다릅니다.
nonce에 대한 Windows 무시 :
환경은 문자열 배열이며 프로그램의 주요 기능으로 전달됩니다. execve (2)를 읽으면 null 종료 이외의 문자열에 대한 요구 사항이나 제한이 없습니다.
일반적으로 각 문자열은 NAME = value로 구성됩니다. 인용 규칙이 없으므로이 규칙에서 이름에 ‘=’를 사용할 수 없습니다.
보통의 사람들은이 끈을 조개 껍질로 토론하여이 끈을 설정합니다. 각 쉘에는 유효한 변수 NAME이 무엇인지에 대한 자체 아이디어가 있으므로 쉘의 생각을 보려면 쉘 페이지의 맨 페이지를 읽어야합니다.
일반적으로 com.baseball.spit = fleagh와 같은 것은 Java 시스템 특성이며 일부 Java 프로그램이 환경으로 되돌아 갈 것인지의 여부에 관계없이 -D로 지정하는 것이 좋습니다.
답변
껍질에 따라 다릅니다. 기본적으로 bash를 사용하고 있다고 생각합니다.이 경우 문자, 숫자 및 밑줄이 허용되지만 변수 이름을 숫자로 시작할 수 없습니다. Bash v.3부터 변수 이름 내에 마침표를 사용할 수 없습니다 .
답변
그렇습니다, 당신은 그것을 할 수 있습니다.
이 장면을 구현 하려면 exec
및 env
명령을 사용하십시오 .
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 aux
PID가 변경되지 않았는지 확인하는 데 사용
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
입니다.
무슨 일이야?
- 쉘 호출 내장 exec
- 셸 내장 exec 호출 syscall.exec는 현재 셸을 대체하는 프로세스 ‘env’를 만듭니다.
- 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:Var
value를 value로 설정 하고 foo
이를 인쇄하는 perl 프로그램을 실행하십시오.
env -i Strange.Env:Var=foo perl -MData::Dumper -E 'say Dumper(\%ENV)'
인쇄합니다
$VAR1 = {
'Strange.Env:Var' => 'foo'
};