[bash] 변수를 소싱하지 않고 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


답변

실행

set -o allexport

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

source conf-file

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

set +o allexport


답변

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

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


답변

경우에 따라 다른 해결 방법이 유용 할 수 있습니다. 내 보낸 변수를 상속하는 다른 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 }

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