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/40156280/

相关文章:

python - 查找所有具有正方形尺寸的图像 (1 :1 ratio)

ruby - 在 IRB 中调用 bash 函数

linux - 在 shell 中创建用户 cron 时出错

ruby - 从 Ruby 调用 `less' 寻呼机会在终端留下垃圾——有什么解决办法吗?

java - 如何从 Java 程序中异步运行 shell 脚本

c - 自动引用不同目录下的头文件

linux - 将 linux cout 重定向到脚本中的变量和屏幕

linux - 将两个 Excel 文件合并为具有共同标题的第三个文件

linux - 如何剪切文件中包含三位数字的单词 (100) - shell 脚本

linux - 需要从大型 linux 文本文件(约 2000 万行)中解析数据字符串并转换为 csv