我已经使用 Linux 和 Mac 一段时间了,我总是想知道 - 为什么我们必须执行这样的程序./progname
。我知道 Unix 将所有事物视为文件,并将文件名存储在指向文件 inode 编号的表中。
但abc.py
与有何不同./abc.py
?
答案1
./abc.py
表示“执行abc.py
当前目录中的文件。”
abc.py
意思是“执行abc.py
在 shell 的目录搜索路径中找到的第一个文件。”
答案2
abc.py
必须位于命令搜索路径中(即,在PATH
环境变量中指定的目录之一中)。./abc.py
是一个精确路径:它abc.py
从当前目录执行(.
)。
在 Unix 世界中,将当前目录放在路径中被认为是一种不好的做法,因为它允许非常简单的恶意攻击,其中以常见 Unix 命令(或常见拼写错误)命名的可执行文件可能会被毫无戒心的用户无意中执行。
例如,一个相当不可能但最具说明性的例子是,攻击者可以留下一个名为的可执行文件rm
并/tmp
等待系统管理员尝试清空该/tmp
目录。
答案3
操作系统会在 $PATH 变量中列出的所有目录中查找要执行的程序。本地目录“./”通常不在 PATH 中。您可以添加它,但这会带来安全隐患。
如果您将“./”添加到 PATH,则有人可以将名为“vi”的程序放在目录中,然后等待有人尝试使用 vi 编辑此目录中的某些内容 - 然后该程序将以刚刚被欺骗的用户的权限执行……在单用户系统上,这可能不是一个严重的问题,但它仍然是一种不好的做法。
答案4
如果 . 不在您的 $path 中,则只需执行 ./abc.py。$path 是环境变量,当您以命令形式输入程序时,它会告诉您的 shell 在哪里查找程序。如果您愿意,可以使用内置了特定位置的其他 shell。