在调用shell时设置环境变量的最佳方法

时间:2014-01-24 06:08:16

标签: linux shell environment-variables environment

我正在编写一个需要能够设置和使用上下文的实用程序。我希望它在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>)。
  • 保存到临时文件,其名称基于shell的PID。这在大多数情况下都可以使用,但删除文件不会自动发生,所以它可能只是在重启之前(即可能永远在许多机器上)。

还有其他想法吗?谢谢!

注意:以上示例使用BASH语法,但在大多数shell中都有等价的。

1 个答案:

答案 0 :(得分:3)

在澄清之前

POSIX shell(bashksh等)和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命令持续时间的位置参数(.等)。还要注意,当文件结束时,由虚线文件创建的任何变量或函数都会保持有效(与正常脚本中的变量不同,后者在脚本完成时消失)。如果你不打算污染用户的名字空间,你必须要小心。