하위 프로세스에 대한 환경 변수를 설정하는 데 사용하려고 합니다 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