값에 공백이 있는 환경 파일에서 변수 내보내기

값에 공백이 있는 환경 파일에서 변수 내보내기

다음 파일 이 있다고 가정해 보겠습니다 .env.

A=1
B=2
C="3 4 5"

내가 실행하면 set -x; echo $(cat .env | xargs):

++ cat .env
++ xargs
+ echo A=1 B=2 C=3 4 5
A=1 B=2 C=3 4 5

내가 실행하면 set -x; export $(cat .env | xargs):

++ cat /tmp/test.env
++ xargs
+ export A=1 B=2 C=3 4 5
+ A=1
+ B=2
+ C=3
bash: export: `4': not a valid identifier
bash: export: `5': not a valid identifier

C그런 다음 값 주위에 따옴표를 유지하거나 추가하기 위해 여러 가지 다른 트릭을 시도했습니다 .

$ set -x; export $(cat /tmp/test.env | xargs printf %q)
+ set -x
++ cat /tmp/test.env
++ xargs printf %q
+ export ''\''A=1'\'''\''B=2'\'''\''C=3' 4 '5'\'''
bash: export: `'A=1''B=2''C=3': not a valid identifier
bash: export: `4': not a valid identifier
bash: export: `5'': not a valid identifier

무엇을 하든 C값은 항상 공백으로 나누어져 있습니다.

편집: 명확히 하기 위해 .env 파일을 순진하게 소싱하는 것을 기반으로 하는 솔루션(대부분의 솔루션은파일에서 변수를 내보내는 방법은 무엇입니까?) 파일에 실행할 명령으로 해석될 수 있는 문자열이 포함되어 있으면 매우 안전하지 않습니다. 내 환경 파일을 키 값 데이터로만 해석하고 싶습니다.

답변1

당신은 그것을 사용할 수 있습니까 parset?

parset "`perl -nE '/[^=]+/ && print "$&,"' .env`" echo ::: "`perl -pe 's/[^=]+=//' .env`"

다음과 같이 입력을 원활하게 처리할 수 있습니다.

vv=* ;   & " echo this is a value - not a command

답변2

xargs따옴표는 실제로 이해되지만(POSIX 셸과 정확히 같은 방식은 아니지만) 실행이 xargs export작동하지 않습니다 . 예를 들어 일반적 으로 내장 되지 않는 xargs셸의 내장 명령이 아닌 독립 실행형 실행 파일만 실행할 수 있기 때문입니다.exportxargs

따옴표가 없는 $(...)쉘 구성 자체는 IFS 분할 + 와일드카드(후자가 아님 zsh)를 수행하고 따옴표를 처리하지 않습니다(그리고 여기서는 와일드카드 부분을 원하지 않습니다).

그러나 쉘이 이기 때문에 bash파일에서 읽은 레코드를 호출하여 NUL로 구분된 레코드를 출력 xargs하고 분할+glob 연산자를 사용하여 bash(bash 4.4+ 필요)에서 분할할 수 있습니다.printf '%s\0'readarray -td ''-d

readarray -td '' assignments < <(xargs -r < .env printf '%s\0')
(( ${#assignments[@]} == 0 )) || export -- "${assignments[@]}"

(여기에서는 입력이 기록되지 않을 때 실행되는 것을 방지하기 위해 GNU 스타일 -r옵션이 사용됩니다 printf.)

관련 정보