使用 .sh 永久设置环境变量

使用 .sh 永久设置环境变量

看过之后使用 .sh 文件设置环境变量如何永久设置环境变量我仍然对如何从.sh文件中正确设置永久环境变量感到困惑(我经常使用Linux,所以我当然是一个新手)。

在我的具体情况下,我有一个setup-env.sh

# Copyright (c) 2015-2019 LunarG, Inc.

# source this file into an existing shell.

VULKAN_SDK="$(dirname "$(readlink -f "${BASH_SOURCE:-$_}" )" )/x86_64"
export VULKAN_SDK
PATH="$VULKAN_SDK/bin:$PATH"
export PATH
LD_LIBRARY_PATH="$VULKAN_SDK/lib:${LD_LIBRARY_PATH:-}"
export LD_LIBRARY_PATH
VK_LAYER_PATH="$VULKAN_SDK/etc/vulkan/explicit_layer.d"
export VK_LAYER_PATH

我可以编辑/home/jonathan/.bashrc以包含:

export VK_LAYER_PATH="/home/jonathan/Vulkan/1.2.170.0/x86_64/etc/vulkan/explicit_layer.d"
export VULKAN_SDK="/home/jonathan/Vulkan/1.2.170.0/x86_64"
export LD_LIBRARY_PATH="/home/jonathan/Vulkan/1.2.170.0/x86_64/lib:"

这就是跑步. setup-env.sh给他们带来的结果。

但这似乎很尴尬并且不必要地困难,是否有更好的方法来运行脚本并让它设置永久环境变量?

答案1

这很复杂的原因是脚本在它们自己的子 shell 中运行:当前环境的副本。因此,一旦脚本退出并返回到原始 shell,脚本设置的任何变量都会被丢弃。然而,由于能够以这种方式设置变量确实很重要,因此有一个工具可以实现这一点。您正在寻找.(或source) 命令:

$ help .
.: . filename [arguments]
    Execute commands from a file in the current shell.
    
    Read and execute commands from FILENAME in the current shell.  The
    entries in $PATH are used to find the directory containing FILENAME.
    If any ARGUMENTS are supplied, they become the positional parameters
    when FILENAME is executed.
    
    Exit Status:
    Returns the status of the last command executed in FILENAME; fails if
    FILENAME cannot be read.

因此,在您的情况下,如果您希望在当前 shell 中设置该文件中的变量,您可以这样做:

$ . /path/to/setup-env.sh

或者,要为每个 shell 完成此操作,您可以将此行添加到您的~/.profile(或者,如果存在的话,您的/.bash_profile)中:

. /path/to/setup-env.sh

您可以将其添加到~/.bashrc其中,但这会降低效率,因为您打开的每个新的非登录交互式 shell 都会读取它(这就是您在图形 Linux 系统中打开终端时得到的结果),而~/.profile只能由登录 shell 因此应该在登录时读取一次,并且永远不要再次读取。现在,某些系统在您以图形方式登录时不会进行源操作~/.profile,因此,如果您发现它在 中不起作用~/.profile,请继续将其添加到 中~/.bashrc

最后,您可以简化它。没有理由单独的变量定义和export命令,您可以一步完成:

export VULKAN_SDK="$(dirname "$(readlink -f "${BASH_SOURCE:-$_}" )" )/x86_64"
export PATH="$VULKAN_SDK/bin:$PATH"
export LD_LIBRARY_PATH="$VULKAN_SDK/lib:${LD_LIBRARY_PATH:-}"
export VK_LAYER_PATH="$VULKAN_SDK/etc/vulkan/explicit_layer.d"

进一步阅读:

答案2

如果句号看起来“尴尬且不必要地困难”,您可以像我一样,在文件中声明别名.bashrc。例如:

alias setenv=". ~/path/to/setup-env.sh"

然后只需运行命令setenv即可在当前 shell 中运行它。 (请参阅 参考资料help alias了解更多信息。)

相关内容