如何从文件中导出变量?

如何从文件中导出变量?

我有一个tmp.txt包含要导出的变量的文件,例如:

a=123
b="hello world"
c="one more variable"

如何使用export命令导出所有这些变量,以便以后子进程可以使用它们?

答案1

set -a
. ./tmp.txt
set +a

set -a导致从现在开始定义的变量被自动导出。它可以在任何类似 Bourne 的 shell 中使用。.是命令的标准名称和 Bourne 名称source,因此我更喜欢它的可移植性(source来自csh大多数现代类似 Bourne 的 shell,现在在大多数现代类似 Bourne 的 shell 中都可用,包括bash(有时行为略有不同))。

在 POSIX shell 中,您还可以使用set -o allexport更具描述性的替代方式来编写它(set +o allexport取消设置)。

您可以使用以下方法将其设为函数:

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"
}

¹ 在 中bash,请注意它也会导致所有功能声明 whileallexport被导出到环境(作为BASH_FUNC_myfunction%%随后由在该环境中运行的所有 shell 导入的环境变量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

A危险的不需要源代码的单行代码:

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

谢谢!

相关内容