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