ファイルから変数をエクスポートするには?

ファイルから変数をエクスポートするには?

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

危険ソースコードを必要としない1行のコード:

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

ありがとうございます!

関連情報