假设 cmd
是一个 *os/exec.Command
。在那些使用 PWD
环境变量(非 Windows 非 Plan 9 平台)的平台上,如果 cmd.Dir
被设置且 cmd.Env
尚未被设置,cmd.Environ
将设置 PWD
。cmd.Environ
有一个建议,即在调用 cmd.Environ
之前应该设置 cmd.Dir
。但这并未得到强制执行。
cmd.Environ
通常用于设置 cmd.Env
。如果在设置 cmd.Dir
之前这样做,那么 PWD
环境变量将无法正确设置。许多程序可能不关心 PWD
。但是对于那些关心它的程序,这可能导致微妙而令人惊讶的行为,例如如何处理符号链接。
如果我们能够在调用 cmd.Environ
之后检查 cmd.Dir
是否被设置,那将会很好。理想情况下,只有在调用 cmd.Environ
以设置 cmd.Env
(可能大多数都是这样)时才触发该检查。
如果我们还可以处理 Package cmd.Environ
的函数,如 internal/testenv.CleanCmdEnv
,那就更好了。不确定实现起来会有多困难。
这个方案的一个缺点是,许多程序可能不关心 PWD
,因此在 cmd.Dir
之后设置它不会导致错误行为。另一方面,cmd.Environ
是相对较新的(在 Go 1.19 中添加),所以也许只有关心这个问题的程序才会使用 cmd.Environ
?
这是来自一个名为 discussion on CL 535915 的文件。cc @bcmills
1条答案
按热度按时间enyaitl31#
我的直觉是,将上述所有要求结合起来可能需要进行过程间类型状态分析。虽然不是不可能,但听起来确实有些棘手。