변수를 소싱하지 않고 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 }
외부에서 변수를 사용하기 때문에 스크립트 파일 쓰기를 피할 수 있습니다.
'IT story' 카테고리의 다른 글
SQL 문을 sargable로 만드는 것은 무엇입니까? (0) | 2020.04.11 |
---|---|
좋은 Java 그래프 알고리즘 라이브러리? (0) | 2020.04.11 |
Node.js가 단일 스레드 인 이유는 무엇입니까? (0) | 2020.04.11 |
BibTeX를 사용하여 모양별로 인용을 주문하는 방법? (0) | 2020.04.11 |
Homebrew의 설치 가능한 패키지 목록을 찾으려면 어떻게합니까? (0) | 2020.04.11 |