IT story

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

hot-time 2020. 4. 11. 10:14
반응형

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


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

export.bash :

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

스크립트를 실행하고 액세스하려고 $VAR하면 아무런 가치가 없습니다!

echo $VAR

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


소싱하지 않고 $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

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


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

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

에서 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

실행

set -o allexport

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

source conf-file

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

set +o allexport

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

export.bash :

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

지금:

./export.bash
echo $VAR

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

스크립트 : myExport

#! \bin\bash
export $1

내 .bashrc의 별칭

alias myExport='source myExport' 

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


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

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

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

참고 URL : https://stackoverflow.com/questions/16618071/can-i-export-a-variable-to-the-environment-from-a-bash-script-without-sourcing-i

반응형