是否可以通过 bash 脚本更改环境变量的值以使其持久存在?

是否可以通过 bash 脚本更改环境变量的值以使其持久存在?

我想使用我声明的环境变量/etc/environment作为计数器,该计数器应该可供在不同时间运行的几个不相关的脚本访问。

这可能吗?到目前为止,我尝试导出其值却没有成功。

我想,我总是可以使用临时文件来存储当前值,并对其进行读取/写入,但如果有的话,我正在寻找一种更优雅的方法?

答案1

简短的回答是“不,您不能在 Bash 脚本中永久更改环境变量”。

较长的答案是,当执行 Bash 脚本时,它会收到一个复制环境的(而不是对环境变量本身的引用)。因此,虽然您可以更改副本在您的脚本中,当脚本退出时,这些更改将会丢失对于您可能同时运行的其他脚本来说也是不可见的。

但是,通过从命令行“source”来使用 Bash 脚本来更改环境变量:

source  your_script_name

答案2

这些更改不会绝对永久,但只要您处于执行脚本的同一登录 shell 中,您就可以保留对环境变量的更改。


有多个命令可以执行 shell 脚本,每个命令都有自己的执行方式。如果您使用点 (.) 运算符运行脚本,则脚本将在同一 shell 中执行,而不是打开另一个 shell 进行执行。

。我的脚本

因此,只要使用点(.)执行该脚本并且执行该脚本的 shell 未关闭,对该脚本中对环境变量所做的更改就会保留下来。

答案3

多年来,我一直在努力解决 Bash 中的这个限制:无法执行脚本并直接更新父 shell 的环境变量。这个问题一直很烦人。后来我突然想到了一个解决方法。它并不完美,而且不可否认,它有点像黑客,但它有效地模拟了看似不可能的事情。如果您能够修改用户的.bashrc,您可以巧妙地伪造直接脚本执行和动态环境配置。您可以这样设置它:

步骤 1:创建env_setup.sh文件

在您的中设置函数和别名之前.bashrc,请确保env_setup.sh脚本存在于您计划管理它们的位置,无论是在特定的项目目录中还是在 PATH 中更全局可访问的位置。

创建一个env_setup.sh具有必要环境变量导出的基本脚本:

# Example env_setup.sh
export PATH="/usr/local/bin:$PATH"
export MY_ENV_VAR="some_value"

将此脚本保存在您经常工作的目录中,或将其放在系统 PATH 的目录中,以确保它可以被普遍访问。

第 2 步:定义函数

首先,您需要在.bashrc文件中定义两个函数。这些函数对于管理脚本的来源至关重要,无论它们是在当前目录中还是在系统 PATH 中的其他地方。

.bashrc在文本编辑器中打开:

vim ~/.bashrc

添加以下函数:

# Function to source a script from the current directory
env_setup_func_dot() {
    if [ -f "./env_setup.sh" ]; then
        source ./env_setup.sh
    else
        echo "env_setup.sh not found in the current directory!"
        return 1
    fi
}

# Function to search and source the script from the PATH
env_setup_func_nodot() {
    local script_path=$(which env_setup.sh)
    if [ -n "$script_path" ]; then
        source "$script_path"
    else
        echo "env_setup.sh not found in the PATH!"
        return 1
    fi
}

步骤 3:创建别名

设置用户可以像调用实际脚本一样调用的别名可以提高可用性。设置这些别名的方法如下:

alias ./env_setup.sh='env_setup_func_dot'
alias env_setup.sh='env_setup_func_nodot'

步骤 4:重新加载.bashrc

要应用这些更改并使函数和别名在当前会话中可用,请重新加载.bashrc

source ~/.bashrc

通过这种设置,您可以有效地模拟直接执行脚本并以最初看似禁止的方式管理 shell 环境。

注意事项

在别名中使用点是不合常规的,并且可能会导致混淆,因为很容易将此类别名误认为文件名或通常为可执行文件或脚本保留的命令。虽然这种设置在技术上可行,但如果在协作环境中共享或在生产环境中部署,则必须确保清楚地记录此类用法。

相关内容