go proposal: cmd/vet: warn if cmd.Dir is set after calling cmd.Environ

evrscar2  于 3个月前  发布在  Go
关注(0)|答案(1)|浏览(44)

假设 cmd 是一个 *os/exec.Command。在那些使用 PWD 环境变量(非 Windows 非 Plan 9 平台)的平台上,如果 cmd.Dir 被设置且 cmd.Env 尚未被设置,cmd.Environ 将设置 PWDcmd.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

enyaitl3

enyaitl31#

  1. "如果我们能有一种方法在调用cmd.Environ之后检查cmd.Dir是否被设置,那就太好了。"
  2. "理想情况下,这种检查只在调用cmd.Environ来设置cmd.Env时触发(可能大多数情况下都是这样)。"
  3. "如果我们还能处理 Package cmd.Environ的函数,比如internal/testenv.CleanCmdEnv,那就更好了。"
    我的直觉是,将上述所有要求结合起来可能需要进行过程间类型状态分析。虽然不是不可能,但听起来确实有些棘手。

相关问题