env를 사용하여 공백이 포함된 환경 변수 설정

env를 사용하여 공백이 포함된 환경 변수 설정

하위 프로세스에 대한 환경 변수를 설정하는 데 사용하려고 합니다 env(다른 소스(예: 파일)에서 읽기). 기본적으로 다음을 시도하고 있습니다.

env VALUE=thisisatest ./somescript.sh

예를 들어 다음과 같은 경우 somescript.sh입니다.

echo $VALUE

그러면 thisisatest예상대로 인쇄됩니다. 하지만 파일에서 변수를 로드하고 싶습니다. 나는 이 지점에 도달했습니다:

env $(cat .vars | xargs -d '\n') ./somescript.sh

하지만,변수에 공백이 포함되어 있으면 문제가 발생합니다(따옴표가 예상대로 작동하지 않음).. 예를 들어:

env $(echo 'VALUE="this is a test"' | xargs -d '\n') ./somescript.sh

오류를 보고합니다

env: is: No such file or directory

그리고 시도해 보세요:

env $(echo 'VALUE="thisisatest"' | xargs -d '\n') ./somescript.sh

나에게 예상치 못한 것을 줄 것이다:

"thisisatest"

env VALUE="thisisatest" ./somescript.sh나는 실행이 따옴표 없이 인쇄하기 때문에 이것이 잘 작동한다고 생각합니다 .

오류에서 나는 어떤 이유로 env가 따옴표가 다음 값이 문자열이어야 함을 의미한다는 것을 이해하지 못한다는 것을 이해합니다. 그러나 따옴표를 올바르게 해석하는 방식으로 이러한 변수를 삽입하는 방법을 잘 모르겠습니다.

누구든지 내가 이것을 달성할 수 있는 방법에 대한 조언을 제공할 수 있습니까?

감사해요!

답변1

명령 대체에는 큰따옴표를 사용해야 합니다. 그렇지 않으면 쉘은 명령 대체 결과에 따라 필드 분할을 수행합니다.

$ env "$(echo 'VALUE="this is a test"')" ./somescript.sh
"this is a test"

파일에서 읽으 려면 env쉘이 필드 분할을 수행하도록 해야 하지만 IFS명령이 공백으로 인해 중단되지 않도록 개행 문자로만 설정해야 합니다.

$ IFS='
'
$ env $(cat .vars) ./somescript.sh

파일에서 읽으려면 소스(일명)를 사용하는 것이 좋습니다.가리키다) 파일 위치 somescript.sh:

#!/bin/bash

. .vars
: The rest of script go here

답변2

이것은 작동합니다:

env -S "`cat .vars`" command

먼저, 파일에서 변수 값을 인용해야 합니다.

VALUE="This has spaces"

그런 다음 이 -S플래그는 변수를 구문 분석하는 데 사용됩니다(따옴표 제거).

env -S "`cat .vars`" command-refers-to-env-vars

물론 $VALUE명령은 쉘에 의해 평가되므로 명령에 인용 할 수 없습니다.이전에행동 env. 이렇게 하려면 다음을 사용해야 합니다.

( . .vars ; echo $VALUE )

괄호는 하위 셸을 열어 셸의 모든 정의로 셸을 오염시키지 않도록 합니다 .vars. 그러나 이러한 변수는 셸에만 적용됩니다. 실제로는 에 없으므로 env프로세스는 process.ENV.VALUE호출을 통해 getenv("VALUE")해당 항목에 액세스 할 수 없습니다 env -S.

두 가지를 결합할 수 있습니다.

( . .vars ; env -S "`cat .vars`" command-refers-to-envs $VALUE )

답변3

실제로 이를 수행하는 더 좋은 방법이 있으며 문제 없이 여러 변수를 선언할 수 있습니다.

env {'VALUE=thisisatest','FOO=this is a test'} printenv

답변4

내 생각엔 당신이 일을 너무 복잡하게 생각하는 것 같아요.

$ env FOO='this is a test' printenv | egrep -i foo
FOO=this is a test

그런데 따옴표는 그렇지 않습니다.이것질문. 값 내에서 변수를 대체하려면 큰따옴표를 사용하고, 변수 대체 등을 방지하려면 작은따옴표를 사용하세요.

필요에 따라 명령 대체를 사용하세요. 형식 문자열을 사용하십시오. 둘 다 사용하세요.

$ env FOO=$'this\tis a test' printenv | egrep -i foo | cat -t
FOO=this^Iis a test
$ env FOO="$(echo $'this\tis a test')" printenv | egrep -i foo | cat -t
FOO=this^Iis a test

도대체 이것은 명령 대체를 사용하는 더 좋은 예일 수 있습니다. 아이디어는 일부 출력을 변환하는 것입니다.필수 명령아무 이유 없이 필요하지 않은 명령 대체를 사용하는 대신 변수에 추가합니다.

$ env FOO="$(man man)" printenv | egrep -iA5 foo=
FOO=man(1)                                    man(1)



NAME
   man - format and display the on-line manual pages

관련 정보