이 스크립트를 가지고 있다고 가정
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 }
외부에서 변수를 사용하기 때문에 스크립트 파일 쓰기를 피할 수 있습니다.