tmp.txt
내보낼 변수가 포함된 파일이 있습니다 . 예를 들면 다음과 같습니다.
a=123
b="hello world"
c="one more variable"
export
나중에 하위 프로세스에서 사용할 수 있도록 명령을 사용하여 이러한 모든 변수를 내보내려면 어떻게 해야 합니까 ?
답변1
set -a
. ./tmp.txt
set +a
set -a
지금부터 정의된 변수를 자동으로 내보내도록 합니다. Bourne과 유사한 모든 쉘에서 사용할 수 있습니다. .
은 명령의 표준 및 Bourne 이름 source
이므로 이식성을 위해 선호합니다( (때때로 약간 다른 동작을 포함하여)를 포함하여 source
대부분 csh
의 현대 Bourne 유사 쉘에서 사용 가능 ) .bash
POSIX 셸에서는 set -o allexport
보다 설명적인 대안( set +o allexport
unset)을 사용하여 작성할 수도 있습니다.
다음을 사용하여 함수로 만들 수 있습니다.
export_from() {
# local is not a standard command but is pretty common. It's needed here
# for this code to be re-entrant (for the case where sourced files to
# call export_from). We still use _export_from_ prefix to namespace
# those variables to reduce the risk of those variables being some of
# those exported by the sourced file.
local _export_from_ret _export_from_restore _export_from_file
_export_from_ret=0
# record current state of the allexport option. Some shells (ksh93/zsh)
# have support for local scope for options, but there's no standard
# equivalent.
case $- in
(*a*) _export_from_restore=;;
(*) _export_from_restore='set +a';;
esac
for _export_from_file do
# using the command prefix removes the "special" attribute of the "."
# command so that it doesn't exit the shell when failing.
command . "$_export_from_file" || _export_from_ret="$?"
done
eval "$_export_from_restore"
return "$_export_from_ret"
}
¹ in bash
, 이로 인해 모든 문제가 발생한다는 점에 유의하세요.기능while 명령문 allexport
은 환경으로 내보내집니다( 실행 중에도 BASH_FUNC_myfunction%%
해당 환경에서 실행되는 모든 쉘이 이후에 환경 변수를 가져옴 ).bash
sh
답변2
source tmp.txt
export a b c
./child ...
다른 질문으로 판단하면 변수 이름을 하드 코딩하고 싶지 않습니다.
source tmp.txt
export $(cut -d= -f1 tmp.txt)
테스트를 받아보세요:
$ source tmp.txt
$ echo "$a $b $c"
123 hello world one more variable
$ perl -E 'say "@ENV{qw(a b c)}"'
$ export $(cut -d= -f1 tmp.txt)
$ perl -E 'say "@ENV{qw(a b c)}"'
123 hello world one more variable
답변3
ㅏ위험한소스 코드가 필요하지 않은 한 줄의 코드:
export $(xargs <file)
- 환경 파일에서 자주 사용되는 주석은 처리할 수 없습니다.
- 질문 예시처럼 공백이 포함된 값은 처리할 수 없습니다.
- 일치하는 경우 실수로 전역 패턴을 파일로 확장할 수 있습니다.
이는 bash 확장을 통해 행을 전달하기 때문에 약간 위험하지만 안전한 환경 파일이 있다는 것을 알고 있으면 작동합니다.
답변4
@Stéphane Chazelas의 훌륭한 답변에 추가하기 위해 다음과 같이 파일에서 set -a
/ 및 해당 항목(예: "to_export.bash")을 사용할 수도 있습니다.set +a
#!/usr/bin/env bash
set -a
SOMEVAR_A="abcd"
SOMEVAR_B="efgh"
SOMEVAR_C=123456
set +a
...그런 다음 파일에 포함된 모든 변수를 다음과 같이 내보냅니다.
. ./to_export.bash
... 또는...
source ./to_export.bash
감사해요!