변수를 소스 없이 Bash 스크립트에서 환경으로 내보낼 수 있습니까?
다음 스크립트가 있다고 가정합니다.
export.syslog:
#! /usr/bin/env bash
export VAR="HELLO, VARIABLE"
하고, 「」에 할 수 .$VAR
★★★★★★★★★★★★★★★★★★★★★★★!
echo $VAR
「 」에 할 수 방법이 ?$VAR
만 하면 .export.bash
싱하지? ??
할 수 있는 요?
$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, VARIABLE
이제 VAR을 리셋합니다.
export VAR=""
echo $VAR
이제 변수를 소스화하고 설정 해제하는 스크립트를 실행합니다.
./test-export.sh
HELLO, VARIABLE
--
.
코드: file test-export.쉿
#!/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
파일 cat 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.쉿
#!/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
.
자동 할당에 대한 최종 업데이트는 VARIAS를 참조하십시오.
./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
스크립트:
파일 test-export.쉿
#!/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
끝나면 실행하세요.이것에 의해, allexport 모드가 디세블이 됩니다.
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. "--" stops processing options,
# key=value list given as parameters
export -- `cat env.vars`
echo $foo # => test
sh -c 'echo $foo' # => test
경우에 따라서는 내보내기 변수를 상속하는 다른 bash 스크립트를 작성하는 것도 도움이 될 수 있습니다.이것은 키스 톰슨의 답변의 특별한 경우로, 그 모든 단점들이 있을 것이다.
파일 export.bash:
# !/bin/bash
export VAR="HELLO, VARIABLE"
bash
지금:
./export.bash
echo $VAR
대답은 '아니오'입니다. 하지만 저는 다음과 같이 했습니다.
스크립트:
myExport
#! \bin\bash
export $1
.bashrc 파일의 별칭:
alias myExport='source myExport'
그래도 출처는 알겠지만, 이런 식으로 하는 것이 더 유용하고 다른 사람에게도 흥미로울 수 있습니다.
스크립트 파일을 사용하여 환경 변수 내보내기
★★★★
스크립트를 실행하면 하위 셸에서 실행되며 실행 후에는 상위 셸로 돌아갑니다.변수를 내보내면 하위 셸에서만 작동하며 하위 셸의 변수를 다시 상위 셸로 내보낼 수 없습니다.
★★★★★★★★★★★★★★★★★★:
스크립트 파일에서 내보낼 변수와 함께 하위 셸을 호출하면 내보내는 변수가 포함된 새 하위 셸이 생성됩니다.
script.sh ->
bash -c 'export VAR=variable; exec bash'
:: CIPH3R
~/.zshrc 또는 ~/.bashrc에 함수를 추가할 수 있습니다.
# set my env
[ -s ~/.env ] && export MYENV=`cat ~/.env`
function myenv() { [[ -s ~/.env ]] && echo $argv > ~/.env && export MYENV=$argv }
외부 변수를 사용하므로 스크립트 파일의 사용을 피할 수 있습니다.
단순하고 순진한 접근법이 효과적입니다.
스크립트 1:
echo "something" > /tmp/myvar
스크립트 2:
myvar=$(cat /tmp/myvar)
발신측 셸의 변수를 설정하는 경우는, cunix 소켓을 사용하는 견고한 어프로치가 있습니다.결과는 다음과 같이 테스트됩니다.
$ ./a.out &
[1] 5363
$ ./b.out 123;a=`./b.out`;echo ${a}
123
[1]+ Done ./a.out
저는 이 문제를 하는 방법을 .alias
스크립트가 스크립트 디렉토리에 배치되어 있을 때만 동작합니다.그렇지 않으면 별칭의 이름이 잘못되었습니다.
이 회피책의 유일한 포인트는 같은 이름의 파일 내에 함수를 포함할 수 있다는 것입니다.사용하기 전에 굳이 파일을 소싱할 필요가 없습니다.에 다음 를 추가합니다.~/.bashrc
:
alias myFunction='unalias myFunction && . myFunction && myFunction "$@"'
지금 전화하실 수 있습니다.myFunction
소싱하지 않고요.
이 회피책은 다른 곳에도 시사되고 있습니다만, 그다지 명확하게는 아닙니다.
스크립트에서는 변수를 설정한 후 반환하지 않고 새 셸을 시작합니다.
사용 사례는 여러 개의 터미널이 열려 있고, 일부 터미널에서는 일부 변수에 대한 값을 원하는 반면 다른 값은 원하는 것입니다.
사용 시source
기억하기 어려울 수 있습니다.이 접근방식의 작은 장점은 사용하는 것을 잊어버렸다는 것을 깨닫는 데 시간이 걸린다는 것입니다.source
처음부터 다시 시작해야 합니다.
(저에게는 이 기능을 사용하는 것이 더 합리적입니다.source script
누락된 변수가 즉시 인식되기 때문입니다.)
rsync에서 옵션 -e에 의해 호출된 스크립트에서 ssh-agent -s를 호출하는 것과 유사한 문제가 발생했습니다.
스크립트 평가 $(ssh-agent -s)에서는 다음 호출을 위한 환경변수는 유지되지 않습니다.
rsync - e 'source ssh-check-agent.sh -p 8022'가 동작하지 않기 때문에 회피책을 강구했습니다.스크립트에서는 다음과 같이 ssh-agent를 호출한 후 변수를 임시 파일에 저장합니다.
echo "export SSH_AUTH_SOCK=$SSH_AUTH_SOCK;" > /tmp/ssh-check-agent.vars
echo "export SSH_AGENT_PID=$SSH_AGENT_PID;" >> /tmp/ssh-check-agent.vars
rsync(백업)를 호출하는 스크립트에서 이후가 됩니다.sh) 전화:
source /tmp/ssh-check-agent.vars
문제는 rsync를 호출하는 스크립트가 소스(source backup.sh)에 의해 호출되어야 한다는 것입니다.
질문이 아닌 것은 알지만(소스를 두 번 사용하고 있습니다), rsync에 대해 비슷한 문제가 있는 사람이 있으면 여기에 적어 둡니다.
언급URL : https://stackoverflow.com/questions/16618071/can-i-export-a-variable-to-the-environment-from-a-bash-script-without-sourcing-i
'programing' 카테고리의 다른 글
SQL Join: 1대 다 관계에서 마지막 레코드 선택 (0) | 2023.04.14 |
---|---|
Excel로의 JSON Import (0) | 2023.04.14 |
PowerShell의 *Nix 'which' 명령어와 동등합니까? (0) | 2023.04.14 |
여러 하위 프로세스가 완료될 때까지 bash에서 기다렸다가 하위 프로세스가 코드 !=0으로 끝날 때 종료 코드 !=0을 반환하는 방법? (0) | 2023.04.14 |
UITextField 암호 숨기기 (0) | 2023.04.14 |