programing

변수를 소스 없이 Bash 스크립트에서 환경으로 내보낼 수 있습니까?

elseif 2023. 4. 14. 21:16

변수를 소스 없이 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

gitub에서 a.c, b.c, a.h를 봐

저는 이 문제를 하는 방법을 .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