如何在Bash中导出变量

11

我需要从Bash脚本设置一个系统环境变量,使其在当前范围之外也可以使用。通常你可以像这样导出环境变量:

export MY_VAR=/opt/my_var

但是我需要这个环境变量在系统级别上可用。这可能吗?

5个回答

14

并不是这样的——一旦你在子进程中运行,就不能影响你的父进程。

有两种可能性:

  1. Source the script rather than run it (see source .):

    source {script}
    
  2. Have the script output the export commands, and eval that:

    eval `bash {script}`
    

    Or:

    eval "$(bash script.sh)"
    

6
这是我所知道的唯一实现你想要的方式:
在foo.sh中,你需要:
#!/bin/bash
echo MYVAR=abc123

当你想获取变量的值时,你需要执行以下操作:

$ eval "$(foo.sh)"  # assuming foo.sh is in your $PATH
$ echo $MYVAR #==> abc123

根据您想要做什么以及如何做到,可以使用Douglas Leeder的建议来使用source,但它将源化整个文件,包括函数等。使用eval,只有被回显的内容才会被评估。


我只是试图自己做那件事。我使用了eval和$(foo),但是我忘记在eval的参数周围加上引号。没有起作用。感谢您提供的语法修复。 - jmanning2k

1

您可能希望使用源代码而不是直接运行可执行文件:

# Executable : exec.sh
export var="test"
invar="inside variable"

source exec.sh
echo $var    # test
echo $invar  # inside variable

这将在与父 shell 相同的 shell 中运行文件。
某些极少数情况下可能存在缺陷:所有变量,无论是否显式导出,都会被导出。如果需要取消设置某些变量,则明确取消设置这些变量。同样地,处理已导入的变量。

# Executable : exec.sh
export var="test"
invar="inside variable"
# --- #
unset invar

1

在文件/etc/profile中设置变量(如果需要,创建文件)。这将使该变量对每个Bash进程都可用。


1
将文件放置在现代发行版的 /etc/profile.d/ 目录下。 - dimich

1
当我在root帐户下工作并且想要打开一个普通用户运行X的可执行文件时,我需要设置DISPLAY环境变量。...
env -i DISPLAY=:0 prog_that_need_xwindows arg1 arg2

答案仍然不完整,没有像被接受的答案中那样的eval语句。点赞是为了一个公平的echo替代方案。 - Himanshu Tanwar

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接