网络命名空间和脚本似乎破坏了 $PATH

网络命名空间和脚本似乎破坏了 $PATH

假设以下脚本:

$ cat test.sh
#!/bin/bash
echo $PATH

有时候是这样的:

$ echo $PATH
/usr/local/bin:/usr/bin:/usr/local/sbin:/usr/sbin:/home/<user>/.local/bin:/home/<user>/bin
$ sudo ip netns exec blue echo $PATH
/usr/local/bin:/usr/bin:/usr/local/sbin:/usr/sbin:/home/<user>/.local/bin:/home/<user>/bin
$ ./test.sh
/usr/local/bin:/usr/bin:/usr/local/sbin:/usr/sbin:/home/<user>/.local/bin:/home/<user>/bin
$ sudo ip netns exec blue ./test.sh
/sbin:/bin:/usr/sbin:/usr/bin

为什么。它破坏了我的脚本生态系统,因为这意味着他们无法看到我的许多二进制文件。

在我测试过的两个发行版中,Fedora 24 是唯一一个可以做到这一点的发行版。 Ubuntu 14.04 的表现$PATH与我预期的一样。

我尝试添加到脚本中

$ sudo ip netns exec blue PATH=$PATH

但它出错了,大概是因为PATH=etcetc它不是真正的命令。

正确的做法是什么?

答案1

您始终可以做两件事: 使用命令的完全限定名称,这样就没有疑问了。在我的任何脚本中,我专门在脚本内设置了 PATH 变量,以避免对环境进行外部修改时出现问题(即独立于环境)。无论如何,这似乎是一个很好的一般做法。

相关内容