jos*_*hlf 3 linux shell environment environment-variables
我正在编写一个需要能够设置和使用上下文的实用程序。我希望它在 shell 中使用环境变量,以便它可以记住当前在调用之间所处的上下文。理想情况下,我想从实用程序本身设置这个环境变量。就像是:
mytool set-context <context>
mytool do-stuff # Aware of <context>
Run Code Online (Sandbox Code Playgroud)
我希望它的行为如下:
export MYTOOL_CONTEXT=<context>
mytool do-stuff # Aware of <context>
Run Code Online (Sandbox Code Playgroud)
现在,程序实际上不可能在调用 shell 的环境中设置环境变量(在 SO here 中有介绍)。但是,这就是我想要的行为,我正在寻找近似值或解决方法。
我想到的一些想法:
<context>,而是设置为从它派生的某个字符串)。那看起来像export MYTOOL_CONTEXT=$(mytool get-context-var <context>).$(mytool set-context <context>),命令的输出实际执行的地方(输出类似于export MYTOOL_CONTEXT=<context>)。还有其他想法吗?谢谢!
注意:以上示例使用 BASH 语法,但在大多数 shell 中都有等价物。
POSIX shell(bash、ksh等)和 Bourne shell 允许您在命令行上仅为一个命令设置环境变量:
MYTOOL_CONTEXT=<context> mytool do-stuff
Run Code Online (Sandbox Code Playgroud)
这将设置MYTOOL_CONTEXT为mytool(仅)调用的环境变量。顺便说一下,大多数 shell 接受一个选项-k(POSIX 没有标准化),这意味着所有看起来像 VAR=value 的参数都被视为环境变量,即使它们出现在命令名称之后。这是一种实用价值相当有限的好奇心,这就是它没有标准化的原因。
POSIXenv命令旨在允许您控制调用命令的环境,尽管它通常不带任何参数用于列出当前环境。因此,或者,您可以使用:
env MYTOOL_CONTEXT=<context> mytool do-stuff
Run Code Online (Sandbox Code Playgroud)
的优点env是您可以在设置命令行中指定的环境变量之前取消设置每个环境变量(因此您可以完全控制环境)。
如果目的是设置环境以供后续使用,则该.命令是要使用的。您可以创建一个文件 ,context其中包含要执行以设置环境的命令。然后你可以使用:
. context
Run Code Online (Sandbox Code Playgroud)
该文件的内容将在当前shell的上下文中执行,这样你就可以设置环境变量等Bash提供的代名词,source为的.命令。它的灵感来自 C shell,它不提供.命令但确实提供source了等效命令。命名为.命令参数的文件将被搜索,$PATH但不需要是可执行的(可读就足够了)。如果您提供额外的参数,它们将成为位置参数($1等).命令。还要注意,点文件创建的任何变量或函数在文件完成时仍然有效(与正常脚本中的变量在脚本完成时消失不同)。如果您不打算污染用户的名称空间,则必须小心。