我可以在 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 脚本 - 没有启动脚本 - 设置我所需的变量和 exec
s 另一个 shell 作为登录 shell。
【问题讨论】:
不确定这是否适用于您的情况,但尝试创建一个设置环境变量的包装脚本,然后执行 =>>"source /etc/profile"。加上在启动/登录时执行的任何其他脚本。 @zee 我考虑过。但是接下来我必须完全复制整个启动过程:登录/交互、正确的profile
和bashrc
文件等。
我可以尝试在没有启动文件的情况下启动 shell,但只执行一个设置环境变量的 shell 脚本,然后 exec
s 一个登录或交互式 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 中声明的环境变量在后续会话中可用吗?
Laravel env() 或 config() 在命令行上获取环境变量