加“.”有什么用? (点)在路径变量中?

加“.”有什么用? (点)在路径变量中?
echo $PATH
/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games

echo $PATH 
/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games:.

上述两个路径变量有什么区别?

我发现这像命令一样执行可执行文件,但我不确定这一点。

答案1

添加.到路径意味着shell会考虑当前目录下的可执行文件,结果是你不再需要输入./作为前缀。在您的情况下,由于它是最后一个条目,因此只有在没有其他匹配的情况下才会执行此类命令;例如,ls仍然会运行/bin/ls

这通常有几个原因不是推荐(见上面的链接):

  • .这可能不利于安全,因为有人可以在您经常访问的目录中留下二进制文件,并希望您意外地运行它——尽管作为最后一个条目而不是第一个条目的风险较小;
  • 在当前目录中运行命令 without./意味着将使用路径中的第一个匹配命令,而不一定是当前目录中的命令。

答案2

一些背景知识:PATH 环境变量是由冒号分隔的目录列表。当您键入命令名称而不给出显式路径时(例如,键入“ls”,而不是“/bin/ls”),您的 shell 会按顺序搜索 PATH 列表中的每个目录,查找该名称的可执行文件,并且shell 将运行它找到的第一个匹配程序。

PATH 列表中的目录之一可以是当前目录“.”。 。也可以在 PATH 列表中使用空目录名来指示当前目录。这两个是等价的

对于 csh 用户:

    setenv PATH :/usr/ucb:/bin:/usr/bin
    setenv PATH .:/usr/ucb:/bin:/usr/bin

对于 sh 或 ksh 用户

    PATH=:/usr/ucb:/bin:/usr/bin export PATH
    PATH=.:/usr/ucb:/bin:/usr/bin export PATH

有“.” PATH 中的某个位置很方便 - 您可以键入“a.out”而不是“./a.out”来运行当前目录中的程序。但有一个问题。

考虑一下在“.”的情况下会发生什么。是 PATH 中的第一个条目。假设您当前的目录是可公开写入的目录,例如“/tmp”。如果恰好有一个名为“/tmp/ls”的程序被其他用户留下,并且您输入“ls”(当然,打算运行正常的“/bin/ls”程序),您的 shell 将而是运行“./ls”,其他用户的程序。不用说,运行这样的未知程序的结果可能会让您感到惊讶。

有“.”稍微好一点。在路径的末尾:

    setenv PATH /usr/ucb:/bin:/usr/bin:.

现在,如果您在 /tmp 中输入“ls”,shell 将在 /usr/ucb、/bin 和 /usr/bin 中搜索名为“ls”的程序,然后再查找“.”,并且无意中运行其他用户的“ls”程序的风险较小。但这并不是 100% 安全 - 如果您是一位笨手笨脚的打字员,有一天输入“sl -l”而不是“ls -l”,那么您将面临运行“./sl”的风险(如果有的话)。一些“聪明”的程序员可以预见到常见的打字错误,并将这些名称的程序分散在公共目录中。谨防。

许多经验丰富的 Unix 用户在没有“.”的情况下也能过得很好。在 PATH 中:

    setenv PATH /usr/ucb:/bin:/usr/bin

如果这样做,您需要键入“./program”而不是“program”来运行当前目录中的程序,但安全性的提高可能是值得的。

相关内容