我最近遇到了一些设置环境变量并在同一命令中启动子进程的示例:
$TEST="test" sh -c 'echo $TEST"
以前,我一直使用env:
$env TEST="test" sh -c 'echo $TEST"
有人能指出我对第一个例子的解释吗?
使用env有什么好处吗?
使用env的原因很少.大多数情况下,您可以(并且应该)使用更简单的语法:
var=value ... command
这是Posix标准,应该可以在任何Posix兼容的shell中使用(包括/ bin / sh).
以下是env有用的几种情况:
>上述语法在csh(或衍生词)中不起作用,也不适用于fish.因此,在这些非Posix shell中,env是本地环境修改所必需的.
> env的-i参数使用仅包含指定环境变量的环境启动指示的命令.这可用于运行不受信任的命令,而不会通过环境变量泄漏信息. (但要小心:从PATH开始,必须为正常运行设置一些环境变量.)
> env使用PATH环境变量将命令的名称解析为可执行文件,可能在env命令行中进行了修改.在未执行路径名解析的上下文中(例如,shebang行),使用env(具有正确的完整文件路径)可以节省必须知道所有其他可能的可执行文件的精确路径. (正因如此,它在shebang线中经常遇到).
>在调用env之前,shell会扩展env的参数.因此,还可以计算环境变量的名称,这是使用标准shell语法无法实现的:
env "$name=$value" command ...
这在从数组扩展环境时(在bash中)特别有用:
env -i "${new_env[@]}" command ...
(这里,new_env应该是一个形式的数组(var1 = val1 var2 = val2 …))
>没有命令的env将打印出(可能已修改的)环境,每行一个环境变量.我没有发现这个功能都有用,但是在Posix基本原理中继续存在env实用程序:
Some have suggested that env is redundant since the same effect is achieved by:
name=value … utility [ argument … ]
The example is equivalent to env when an environment variable is being added to the environment of the command,but not when the environment is being set to the given value. The env utility also writes out the current environment if invoked without arguments. There is sufficient functionality beyond what the example provides to justify inclusion of env.