我可以在 Bash 的命令行上设置环境变量吗?

Posted

技术标签:

【中文标题】我可以在 Bash 的命令行上设置环境变量吗?【英文标题】:Can I set an environment variable on Bash's command line? 【发布时间】:2017-09-18 20:49:00 【问题描述】:

我正在尝试为 Bash 设置环境变量。但是,我需要在任何 shell 的启动脚本(包括 /etc/profile)之前设置它之前,因为 /etc/profile 的行为会根据此变量的值而有所不同。

具体来说,我想创建一个类似于git-bash 的 MinTTy 快捷方式,但我需要在 shell 启动之前设置 MSYSTEM 环境变量,或者至少在它开始处理任何启动脚本之前设置。

在启动 shell 之前让 MinTTy 设置环境变量的解决方案也将被接受。

编辑: 我真正想要的是 BASH 的一种命令行选项,它将设置一个环境变量,有点类似于大多数 C(和其他)编译器的 -D 选项。这将是一个“一般情况”解决方案。或者,与 MinTTy 类似的选项(命令行或配置)也可以完成这项工作。

针对我的特定需求,我有一个可能的解决方法的想法:运行一个 BASH 脚本 - 没有启动脚本 - 设置我所需的变量和 execs 另一个 shell 作为登录 shell。

【问题讨论】:

不确定这是否适用于您的情况,但尝试创建一个设置环境变量的包装脚本,然后执行 =>>"source /etc/profile"。加上在启动/登录时执行的任何其他脚本。 @zee 我考虑过。但是接下来我必须完全复制整个启动过程:登录/交互、正确的profilebashrc 文件等。 我可以尝试在没有启动文件的情况下启动 shell,但只执行一个设置环境变量的 shell 脚本,然后 execs 一个登录或交互式 shell。 您为什么担心启动过程?他们会重写你的环境变量吗?还是只是一种偏好? 【参考方案1】:

虽然我已经接受了上面的答案,但我发现这个链接专门解决了我的问题的第二部分(特定于 Mintty)或在运行命令之前设置环境变量的替代方法。

Windows快捷方式的内容可以是:

C:\cygwin64\bin\mintty.exe -t "Title" /bin/env "MSYSTEM=MINGW64" /bin/bash -l

(由Mintty Tips:Setting environment variables建议。)

【讨论】:

【参考方案2】:

如下定义快捷方式文件的目标:

C:\cygwin64\bin\mintty.exe /bin/bash -l -c "MSYSTEM=MINGW64 exec -l bash"

这个命令:

直接调用bash作为登录shell (-l) 向它传递一个命令 (-c),该命令定义感兴趣的环境变量 (MSYSTEM=MINGW64),然后调用 bash (exec -l bash) 的新副本,该副本继承现有环境,加上新定义, 但由于 -l 而再次获取配置文件 (并将 - 添加到在 $0 (-bash) 中报告的可执行文件名称前,如果您仅使用 - 启动 Mintty 就会发生这种情况,这是常规的 Cygwin64 Terminal 快捷方式所做的)。

另一种方法是先在Windows中设置环境变量。

[不是 OP 的选项] 如果环境变量应该始终具有相同的值,请按如下方式持续设置:运行sysdm.cpl,转到Advanced 选项卡,单击Environment Variables... 并根据需要定义变量MSYSTEM

要定义变量ad-hoc,请按如下方式创建一个批处理文件,并使快捷方式以该批处理文件为目标:

@echo off

# Define the env. variable with the desired value.
set "MSYSTEM=MINGW64"

# Invoke Mintty with a login shell, which will now see the env. variable.
# Adjust the path to mintty.exe as needed.
c:\cygwin64\bin\mintty.exe -

注意:从快捷方式打开批处理文件会在打开 Mintty 之前短暂打开一个常规控制台窗口,这可能是不受欢迎的。

一个简单的辅助 WSH 脚本,如我的 this answer 所示,可以防止这种情况发生。

【讨论】:

@Menachem:我的荣幸;好点回复-;不过,为了与默认行为保持一致,我已经更新了答案,我使用了exec -l bash,因此$0 报告-bash,而不是-/bin/bash【参考方案3】:

您应该能够像在命令提示符下那样做。因此,您可以这样做:

set VAR=VarContents

【讨论】:

我可以建议你删除这个答案吗?它复制了我的答案中的内容(即使在您发布答案时我的答案的原始形式也存在),并且它本身不足以解决 OP 的问题。

以上是关于我可以在 Bash 的命令行上设置环境变量吗?的主要内容,如果未能解决你的问题,请参考以下文章

"export" 命令行 - 在 bash_profile 中声明的环境变量在后续会话中可用吗?

如何在 Ruby 脚本中为命令 shell 获取环境变量?

Laravel env() 或 config() 在命令行上获取环境变量

设置Windows PowerShell环境变量

如何正确设置 PHP 环境变量以在 Git Bash 中运行命令

使用 env 在 bash 中为一个程序调用设置环境变量