bash - 为什么在可执行文件或脚本名称之前需要 ./(点斜杠)才能在 bash 中运行它?

标签 bash shell unix command-line

在bash中运行脚本时,我必须在开头写./:

$ ./manage.py syncdb

如果我不这样做,我会收到一条错误消息:

$ manage.py syncdb
-bash: manage.py: command not found

这是什么原因?我认为 . 是当前文件夹的别名,因此这两个调用应该是等价的。

我也不明白为什么我在运行应用的时候不需要./,比如:

user:/home/user$ cd /usr/bin
user:/usr/bin$ git

(在没有 ./ 的情况下运行)

最佳答案

因为在 Unix 上,通常当前目录不在 $PATH 中。

当您键入命令时,shell 会查找由 PATH 变量指定的目录列表。当前目录不在该列表中。

当前目录不在该列表中的原因是安全性。

假设您是 root 并进入另一个用户的目录并键入 sl 而不是 ls。如果当前目录在 PATH 中,shell 将尝试在该目录中执行 sl 程序(因为没有其他 sl 程序) .那个 sl 程序可能是恶意的。

它适用于 ./ 因为 POSIX specifies包含 / 的命令名称将直接用作文件名,从而禁止在 $PATH 中进行搜索。您可以使用完整路径来获得完全相同的效果,但 ./ 更短且更易于编写。

编辑

那个 sl 部分只是一个例子。 PATH 中的目录按顺序搜索,当匹配到该程序时执行该程序。因此,根据 PATH 的外观,键入普通命令可能足以或可能不足以在当前目录中运行程序。

关于bash - 为什么在可执行文件或脚本名称之前需要 ./(点斜杠)才能在 bash 中运行它?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48550974/

相关文章:

linux - Nagios 插件监控日志文件中的多个单词

bash - 使用 grep 或 sed 即时复制和修改复杂的行

bash - 可能的攻击 : echo -e

Bash 脚本 "Usage"输出格式

linux - 如果关键字触发然后执行命令,Shell 脚本来监视日志文件?

linux - 如何正确操作 : grep -ri '->'

linux - 如果目录没有文件那么... - Linux

mysql - 令人困惑的时间输出

Linux vi文件内容修改

linux - 如何在 shell 脚本中逐行从文件中分离关键字?