다른 상자의 모든 "env" 변수를 내 로컬 컴퓨터로 가져오고 싶습니다. 환경 변수를 로컬 상자의 env_var.txt에 복사했습니다. 나는 다음을 수행했습니다.
for i in `cat env_var.txt`; do export $i; done
그러나 이것은 모든 환경 변수를 올바르게 설정하지 않는 것 같습니다. 이미 편집했어요
do export $i
입력하다
do echo $i
그리고 변수는 모든 것이 괜찮은 것으로 보입니다. 이 문제의 원인은 무엇입니까? 아니면 모든 환경 변수를 가져오는 다른 방법이 있나요?
답변1
TL,DR: 수출
export -p >env_var.sh
그리고 수입
. env_var.sh
env_var.txt
코드가 유효한지 여부는 변수 이름과 값에 있는 서식과 특수 문자(즉, 셸 구문에서 특별한 의미를 갖는 문자)에 따라 달라집니다.
`cat env_var.txt`
따옴표 없는 명령 대체입니다. 인용되지 않은 변수 명령 대체에는 "split+glob" 연산자가 적용되어 있습니다. 먼저 명령의 출력을 변수 value 의 문자로 분할한 IFS
다음 각 부분을 파일 이름 와일드카드 패턴으로 해석하고 일치하는 각 Patterns 일부 파일을 일치하는 파일로 바꿉니다. 이름. 결과는 for
루프가 반복되는 단어 목록입니다.
따옴표가 없는 명령 대체는 사용자가 원하는 경우가 거의 없으며 이 경우에는 확실히 원하는 것이 아닙니다. 그러나 파일 구문이 다음과 같은 경우에는 작동합니다.env
변수 값에 *?\[
또는 공백이 포함되어 있지 않습니다..
env_var.txt
yes 인 경우 env
, 이해되지 않는 구문 분석 방법을 사용하는 대신 실제 구문(줄 바꿈으로 구분된 할당)을 기반으로 구문 분석하면 더 나은 결과를 얻을 수 있습니다. 가장 쉬운 방법인 분할+글로브 연산자를 사용하려면 IFS
개행 문자로만 설정하고 와일드카드 일치를 끄세요.
set -f; IFS='
'
export `cat env_var.txt`
set +f; unset IFS
그러나 수신측에서는 해결되지 않는 문제, 즉 출력이 env
불분명하다는 문제가 있다. 다음을 고려하면:
foo=bar
hello=world
foo
두 개의 변수(하나는 값으로 호출 bar
되고 하나는 hello
값으로 호출됨) 가 있는지 world
, 아니면 하나만 foo
값 으로 호출되는지 알 수 없습니다.
bar
hello=world
명시적인 방법으로 환경 변수를 내보내려면사용하지 말고 env
대신 export
사용하세요. 이 명령은 export -p
모든 환경 변수의 값을 셸에서 구문 분석할 수 있는 형식으로 나열합니다. 따라서 수출 측면에서 다음을 실행하십시오.
export -p >env_var.sh
가져오기 측면에서 다음을 실행합니다.
. env_var.sh
경고: Bash에서는 출력을 export -p
구문 분석할 수 있지만 bash에서만 가능합니다. 다른 sh 스타일 쉘에서 작동하는 출력을 얻으려면 POSIXLY_CORRECT
임의의 값으로 설정하십시오. 이것은 다른 껍질에 해로운 영향을 미치지 않으므로 다음을 수행할 수 있습니다.
(POSIXLY_CORRECT=$POSIXLY_CORRECT; export -p) >env_var.sh
이전 값으로 설정해도 POSIXLY_CORRECT
출력에는 아무런 영향이 없습니다. 환경에 있지 않고 실행 후 나타나지 않거나 환경에 있고 해당 값이 변경되지 않습니다. 그러나 이는 bash가 export
출력에서 export -p
bash 특정 구문 대신 이식 가능한 구문을 사용하도록 강제하는 데 충분합니다 declare
.
환경 변수를 가져오면 임의 코드가 실행될 수 있으므로 env_var.txt
신뢰할 수 있는 소스에서만 가져오거나 가져오십시오. 원인은 env_var.sh
코드가 실행된다는 사실이 아니라 환경 변수입니다. 단순히 , , 등과 같은 변수를 가져오는 것만으로도 코드가 추가로 실행될 수 있습니다.. env_var.sh
PATH
LD_PRELOAD
ENV
답변2
bash "source" 명령을 다음과 같이 사용하세요:
source env_var.txt
모든 변수를 가져와야 합니다.
더 많은 정보를 알고 싶다면:https://en.wikipedia.org/wiki/Dot_(명령)