避免 PATH 中的实用程序名称冲突

避免 PATH 中的实用程序名称冲突

我一直犹豫是否要在PATH环境变量中包含任何用户定义的目录或将自定义脚本放入已包含的目录中。

原因是我不知道如何避免(诚然)不太可能的边缘情况,即调用外部程序的二进制文件恰好与我的自定义脚本之一具有相同的名称,而机器上不存在所需的二进制文件因此,程序实际上调用了我的自定义脚本,这只会导致麻烦。

这有点类似于使用同名的自定义脚本隐藏二进制文件,就像通常使用包装器脚本完成的那样。然而,在这种情况下,机器上不存在相关程序(只有同名的自定义脚本),因此变量中自定义脚本位置的位置PATH也根本不重要。

除了不将自定义脚本存储在变量使用的目录中之外,还有什么方法可以避免这种情况吗PATH?我想到的唯一可能性是始终使用绝对路径来调用自定义脚本。

答案1

三种解决方案:

  1. 始终按照您自己的建议使用绝对路径调用自定义脚本,而无需修改$PATH.

    这将确保您在知道需要时调用自己的脚本,并且您的脚本不会意外“隐藏”任何其他实用程序。

  2. 确保自定义脚本的路径位于 的末尾$PATH,位于标准目录和包含第 3 方软件的目录的路径之后。

    这样做的缺点是,如果您碰巧有一个与另一个实用程序同名的脚本,您将调用该实用程序而不是您自己的脚本。这是你所关心的问题的逆向问题。

  3. 只需确保您的脚本具有唯一的名称,然后按照上一点进行操作即可。

    系统实用程序很少(并且标准实用程序从不),例如,用作.sh文件名后缀。您还可以/或者考虑建立一个“命名空间”,例如wally-您自己的脚本的前缀(wally-backup.shwally-getmail)。

一般来说,您应该知道标准 Unix 实用程序的名称并避免使用它们(test例如,对于自定义实用程序来说, 是一个不好的名称)。标准实用程序名称列表可以在这里找到。同样,特殊内置实用程序的名称不应用于自定义脚本。这些列于此链接的末尾


如果您修改了您的$PATH,请修改它私下里,即仅适用于您登录的非特权用户。不要在系统范围内修改它,除非您是多用户系统上的系统管理员,并且您的脚本实际上是供其他人使用的(并且他们$PATH出于某种原因修改自己的脚本会很麻烦) 。如果您修改系统$PATH,请绝对确保不会发生“阴影问题”,否则基本系统功能可能会受到损害,具体取决于可能$PATH使用的位置。

相关内容