我看到很多次控制台命令
./redis-server
要么
./mongo
究竟是什么意思?
. 是当前目录。 因此,该命令告诉shell在当前目录中查找可执行文件。
不要混淆. foo . foo ,这是一个完全不同的命令。
温你运行一个没有任何前缀的命令,然后Unix系统在PATH查找命令。 例如,如果inputls则Unix将遍历PATH列出的所有path以查找ls二进制文件。
例如,让我们假设你的PATH被设置为/bin:/usr/bin:/usr/local/bin然后inputls会让你的shell在/bin/lsfind命令并执行它。
Unix系统应按照它们在PATH中列出的顺序来评估PATH 。 所以如果你安装了多个ls它会执行第一个忽略其他的。 所以在上面的例子中,你可能会在/usr/local/bin/ls安装另一个ls ,如果你只inputls那么这个/usr/local/bin/ls是不会被使用的。 如果要执行/usr/local/bin/ls则可以修改PATH或使用绝对path键入/usr/local/bin/ls 。
现在说到你的./前缀。 的. 仅仅是指当前的文件夹。 所以如果你用./前缀命令,你的shell会在当前文件夹中查找命令。 事实上
./command
是相同的
`pwd`/command
或(在BASH上)
${PWD}/command
正如Windows命令行中已经提到的那样,如果要从当前文件夹执行command.exe ,则可能只用于inputcommand 。 这是因为在searchpath之前,Windows隐式地首先在当前工作文件夹中查找二进制文件。
不幸的是,这是相当不安全的。 让我们想象一下,我想窃取用户信息,这是我作为普通用户无法访问的信息。 我只是将一个非常简单的脚本放在我的主目录“ls”中,其内容如下:
#!/bin/bash cp /etc/shadow /home/my-user > /dev/null 2>&1 chown my-user /home/my-user/shadow > /dev/null 2>&1 /bin/ls $*
然后使其可执行。
然后,我打电话给我的系统pipe理员,并告诉他一些关于我的主目录中一些非常奇怪的文件名的故事。 很可能pipe理员login在shell(希望作为根)cd进入我的目录并执行ls 。 会发生什么事情是,系统pipe理员将执行我的ls脚本,而不是/bin/ls ,只是将一个/etc/shadow的副本放到我的home文件夹中。 那么,pipe理员可能会想知道为什么这个ls不会列出文件名。 所以脚本只是在最后一行执行“real” /bin/ls命令。
所以为了防止这样的问题,大多数现代的Unix系统在searchpath中不包含当前目录( . )。 基本上,如果没有指定完整path而执行一个命令,shell将只在通常包括可信path(非用户可写)的path内执行二进制文件。 当你在文档中看到./mongo ,这意味着你必须确保从正确的文件夹执行mongo ,而不是path中的某个mongo二进制文件。
如果您经常从当前path执行二进制文件,则可以简单地添加“。” 手动到PATH列表:
export PATH=".:$PATH"
从现在开始,shell将总是先查找当前目录中的二进制文件。 如上所述,这是非常危险的,因为每次执行命令时都必须检查当前工作目录的二进制文件,甚至在执行之前。 不幸的是,为了检查当前目录中的二进制文件,通常会使用“ls”,它可能已经执行了一个二进制文件,这是你不能指望的。
我个人经常在我的$HOME/.profile使用以下内容:
export PATH="~/bin:$PATH"
这允许我把一些脚本放在我的$HOME/bin文件夹中,并运行它们而不必指定完整的path。 但请记住, $HOME/bin也是我的可信任path。
另一个小笔记。 每个目录(甚至是空的)都包含两个硬链接。 检查ls -a输出:
. ..
的. 条目是指当前目录,而..条目是硬链接到父目录。 这是启用相对path。 当然,它也允许recursion定义,比如././././././command来执行command . 总是指同一个目录。 你也可以执行一些像/bin/../bin/./././../bin/ls这个完全有效的东西。
我希望这个澄清一下. 和..条目是关于。