파일에서 변수를 내보내는 방법은 무엇입니까?

파일에서 변수를 내보내는 방법은 무엇입니까?

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 allexportunset)을 사용하여 작성할 수도 있습니다.

다음을 사용하여 함수로 만들 수 있습니다.

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%%해당 환경에서 실행되는 모든 쉘이 이후에 환경 변수를 가져옴 ).bashsh

답변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

감사해요!

관련 정보