我在 Red Hat Linux 的终端上乱搞,当我输入星号 ( *
) 然后回车时,它执行了我目录中的一个程序。为什么?
我最好的猜测是,Unix 将其视为通配符,因此它执行了第一个按字母顺序排列的程序。由于my_program.exe
和one_of_my_programs.program
可以通过简单地键入文件的名称来执行,因此通配符运算符代表了所有可能的文件。由于程序是按字母顺序排列的第一个程序,因此 Unix 会执行它。这是正确的判断吗?
答案1
您的解释是正确的。其余文件将作为其参数列表呈现。
请注意,仅当程序设置了可执行位并且当前目录在列表中时,它才会执行此操作PATH
。
以下几点可能有助于理解:-
- 如果您输入,
./*
则该PATH
条目不是必需的。 - 如果您输入
. *
或,. ./*
并且第一个匹配的文件是脚本,那么它不需要是可执行文件,也不需要当前目录PATH
(对于除 之外的 shell 可能并非如此bash
)。
答案2
这表明这.
是变量的一部分PATH
。出于安全原因,这确实是一个坏主意(当然,Windows 必须将其设为不可修改的默认值)。
但是,这个“建议”只是稍微有效:如果你rm
在当前目录中有一个名为的文件,*
那么执行默认 rm
:
/tmp$ mkdir ohno
/tmp$ cd ohno
/tmp/ohno$
/tmp/ohno$ ls
/tmp/ohno$ touch rm what
/tmp/ohno$ ls
rm what
/tmp/ohno$ *
/tmp/ohno$ ls
rm
/tmp/ohno$
如您所见,它不是rm
在当前目录(一个空的、不可执行的文件)中执行的,而是在系统默认的目录中执行的/bin/rm
。
当涉及通配符时,请务必仔细检查您的命令。以下是有史以来最可怕的消息之一:
rm: cannot remove '.o': No such file or directory
这是调用的结果
rm * .o
,或多或少是人们能想到的最糟糕的虚假空间位置。