변수를 소싱하지 않고 bash 스크립트에서 환경으로 변수를 내보낼 수 있습니까?


282

이 스크립트를 가지고 있다고 가정

export.bash :

#! /usr/bin/env bash
export VAR="HELLO, VARIABLE"

스크립트를 실행하고에 액세스하려고하면 $VAR값이 없습니다!

echo $VAR

export.bash 를 소싱하지 않고 $VAR실행 하여 액세스 할 수있는 방법 이 있습니까?


1
스크립트 대신 별칭을 사용하여 변수를 정의 할 수 있습니다.
jdigital

내가 작업하고있는 스크립트는 일종의 자바 가상 관리자이며 계산을 한 다음 $ JAVA_HOME을 env로 내보내고 PATH에 추가해야합니다.
tarrsalah

정보를 파일에 쓴 다음 다시 읽을 수는 있지만 소싱이 훨씬 쉬워 보입니다.
jdigital

7
자식 프로세스는 부모 환경을 변경할 수 없습니다. 부모는 (하나와 자체 변경을 선택해야 source하거나 eval또는 ...)
글렌 잭맨

1
소스에 더 읽으려면, man source하지 작업 때문에 것 source떠들썩한 파티에 내장되어 있습니다, 당신은 실행해야help source
peterchaula

답변:


318

소싱하지 않고 $VAR실행 하여 액세스 할 수있는 방법 export.bash이 있습니까?

빠른 답변 : 아니요.

그러나 몇 가지 가능한 해결 방법이 있습니다.

이미 언급 한 가장 확실한 방법 은 호출 쉘의 컨텍스트에서 스크립트 를 사용 source하거나 .실행하는 것입니다.

$ cat set-vars1.sh 
export FOO=BAR
$ . set-vars1.sh 
$ echo $FOO
BAR

또 다른 방법은 환경 변수를 설정하는 대신 스크립트를 사용하여 환경 변수를 설정하는 인쇄 명령을 사용하는 것입니다.

$ cat set-vars2.sh
#!/bin/bash
echo export FOO=BAR
$ eval "$(./set-vars2.sh)"
$ echo "$FOO"
BAR

세 번째 방법은 환경 변수를 내부적으로 설정 한 다음 해당 환경에서 지정된 명령을 호출하는 스크립트를 사용하는 것입니다.

$ cat set-vars3.sh
#!/bin/bash
export FOO=BAR
exec "$@"
$ ./set-vars3.sh printenv | grep FOO
FOO=BAR

이 마지막 접근 방식은 현재 쉘의 설정을 제공하지 않기 때문에 대화 형으로 사용하기에 불편하지만 매우 유용 할 수 있습니다 (기타 모든 설정 및 기록 포함).


57

VAR 변수를 먼저 내보내려면 가장 논리적이며 작동하는 방법은 변수를 소싱하는 것입니다.

. ./export.bash

또는

source ./export.bash

이제 메인 쉘에서 에코 할 때 작동합니다

 echo $VAR
HELLO, VARABLE

이제 VAR을 재설정하겠습니다

export VAR=""
echo $VAR

이제 스크립트를 실행하여 변수를 소싱 한 다음 설정을 해제합니다.

./test-export.sh 
HELLO, VARABLE
--
.

코드 : cat test-export.sh

    #!/bin/bash
    # Source env variable
    source ./export.bash

    # echo out the variable in test script
    echo $VAR

    # unset the variable 
    unset VAR
    # echo a few dotted lines
    echo "---"
    # now return VAR which is blank
    echo $VAR

여기에 한 가지 방법이 있습니다

참고 사항 : 내보내기는 기본 콘솔에서 내보내기를 실행하는 스크립트로 제한됩니다 .cron 작업에 이르기까지 아래처럼 콘솔과 같이 콘솔을 추가합니다 ... 명령 부분에 여전히 의문의 여지가 있습니다. 여기에 방법이 있습니다. 쉘에서 실행하십시오.

export.bash에 여러 개의 에코 값이있는 경우 명령 프롬프트에서

IFS=$'\n'; for entries in $(./export.bash); do  export $entries;  done; ./v1.sh 
HELLO THERE
HI THERE

고양이 v1.sh

#!/bin/bash
echo $VAR
echo $VAR1

이제 이것이 당신의 용도라면-다음과 같이 bash 별칭을 사용하여 언제든지 스크립트에 변수를 사용할 수 있습니다.

myvars ./v1.sh
HELLO THERE
HI THERE

echo $VAR

.

이것을 .bashrc에 추가하십시오.

function myvars() { 
    IFS=$'\n'; 
    for entries in $(./export.bash); do  export $entries;  done; 

    "$@"; 

    for entries in $(./export.bash); do variable=$(echo $entries|awk -F"=" '{print $1}'); unset $variable;
done

}

bashrc 파일을 소스하면 언제든지 위와 같이 할 수 있습니다 ...

어쨌든 나머지 부분으로 돌아가서

이를 통해 전 세계에서 사용할 수있게되었고 스크립트가 실행되었습니다.

단순히 에코 한 다음 에코에서 내보내기를 실행하십시오!

고양이 export.bash

#!/bin/bash
echo "VAR=HELLO THERE"

이제 스크립트 또는 콘솔에서 다음을 실행하십시오.

 export "$(./export.bash)"

시험:

echo $VAR
HELLO THERE

위의 방법을 사용하여 다른 스크립트에서 예상되는 것을 알고있는 한 여러 값 :

고양이 export.bash

#!/bin/bash
echo "VAR=HELLO THERE"
echo "VAR1=HI THERE"

고양이 test-export.sh

#!/bin/bash

IFS=$'\n'
for entries in $(./export.bash); do
   export $entries
done

echo "round 1"
echo $VAR
echo $VAR1

for entries in $(./export.bash); do
     variable=$(echo $entries|awk -F"=" '{print $1}');
     unset $variable
done

echo "round 2"
echo $VAR
echo $VAR1

이제 결과

 ./test-export.sh 
round 1
HELLO THERE
HI THERE
round 2


.

자동 할당에 대한 최종 최종 업데이트는 변수를 읽습니다.

./test-export.sh 
Round 0 - Export out then find variable name - 
Set current variable to the variable exported then echo its value
$VAR has value of HELLO THERE
$VAR1 has value of HI THERE
round 1 - we know what was exported and we will echo out known variables
HELLO THERE
HI THERE
Round 2 - We will just return the variable names and unset them 
round 3 - Now we get nothing back

스크립트 : cat test-export.sh

#!/bin/bash

IFS=$'\n'
echo "Round 0 - Export out then find variable name - "
echo "Set current variable to the variable exported then echo its value"
for entries in $(./export.bash); do
 variable=$(echo $entries|awk -F"=" '{print $1}');
 export $entries
 eval current_variable=\$$variable
 echo "\$$variable has value of $current_variable"
done


echo "round 1 - we know what was exported and we will echo out known variables"
echo $VAR
echo $VAR1

echo "Round 2 - We will just return the variable names and unset them "
for entries in $(./export.bash); do
 variable=$(echo $entries|awk -F"=" '{print $1}');
 unset $variable
done

echo "round 3 - Now we get nothing back"
echo $VAR
echo $VAR1

파일을 소싱하지 않고 파일을 실행하여 VAR을 내보내고 싶습니다.
tarrsalah

@vahid 스크립트가 무엇을하고 있는지 설명해야합니다.
FDinoff

1
소싱 후 변수를 설정 해제하지 않는 이유는 무엇입니까? 시험 해보는 스크립트를 업데이트하려고하는 고통보다 훨씬 쉬워집니다.
VH

Tarrsalah
VH

ok 최종 업데이트-제안 된 방법 및 해결 방법에 관한 문제 bashrc 별칭 아이디어는 아마도 좋은 방법 일 것입니다.
VH

22

실행

set -o allexport

이후 파일에서 소스 한 변수는 셸로 내보내집니다.

source conf-file

완료되면 실행하십시오. 모든 내보내기 모드가 비활성화됩니다.

set +o allexport

7
문제의 핵심은 "소스없이 내보내는 방법"입니다. 이 답변은 출처를 사용합니다.
Gonen I

@ekkis 네, 정확히 질문에 대답하지는 않지만 파일에서 변수를 내보내는 방법을 Google 검색 할 때 마다이 스레드가 나타났습니다. 그래서 나는 그것을 저 자신을 위해 거기에 두었습니다.
mdornfe1

간단하고 사용하기 쉽습니다. 이것은 답변으로 표시되어야합니다.
QkiZ

1
나는 원래의 문제 진술이 이것이 나의 근본적인 해결책이라는 것을 이해하게했기 때문에 이것을 찬성했다. allexport에 대한 공식 문서는 여기에 있습니다 : gnu.org/software/bash/manual/html_node/The-Set-Builtin.html
benjaoming

아, +1. 이 질문은 bash source exportGoogle 키워드의 최고 결과
ttimasdf

14

파일에서 환경 변수를 내보내는 흥미롭고 깔끔한 방법을 찾았습니다.

에서 env.vars:

foo=test

테스트 스크립트 :

eval `cat env.vars`
echo $foo         # => test
sh -c 'echo $foo' # => 

export eval `cat env.vars`
echo $foo         # => test
sh -c 'echo $foo' # => test

# a better one
export `cat env.vars`
echo $foo         # => test
sh -c 'echo $foo' # => test

7

경우에 따라 다른 해결 방법이 유용 할 수 있습니다. 내 보낸 변수를 상속하는 다른 bash를 작성하십시오. @Keith Thompson의 대답은 특별한 경우입니다.

export.bash :

# !/bin/bash
export VAR="HELLO, VARIABLE"
bash

지금:

./export.bash
echo $VAR

당신이 쓴 것이 확실합니까?! : 난 당신이 라인 명령을 실행해야한다는 생각. ./export.bash
경 조 블랙

@ 조 블랙 선생님, 그렇습니다. export.bash 파일의 마지막 행은 bash현재 쉘의 하위로 호출 됩니다. VAR이전에 내 보낸 이후 에는 해당 호출에 변수가 포함됩니다. 물론 입력 exit하면 VAR외출입니다. 확인 했습니까?
Gonmator

확인! 나는 그 호출을 보지 못했다 ... : p
조 블랙 선생님

1

대답은 '아니오'입니다. 그러나 저는 다음과 같이했습니다.

스크립트 : myExport

#! \bin\bash
export $1

내 .bashrc의 별칭

alias myExport='source myExport' 

아직도 당신은 그것을 소스,하지만이 방법으로 더 유용하고 다른 사람에게 재미있을 것입니다.


1

~ / .zshrc, ~ / .bashrc에 함수를 작성할 수 있습니다.

# set my env
[ -s ~/.env ] && export MYENV=`cat ~/.env`
function myenv() { [[ -s ~/.env ]] && echo $argv > ~/.env && export MYENV=$argv }

외부에서 변수를 사용하기 때문에 스크립트 파일 쓰기를 피할 수 있습니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.