星号作为 Unix 中的独立命令有何功能?

星号作为 Unix 中的独立命令有何功能?

我在 Red Hat Linux 的终端上乱搞,当我输入星号 ( *) 然后回车时,它执行了我目录中的一个程序。为什么?

我最好的猜测是,Unix 将其视为通配符,因此它执行了第一个按字母顺序排列的程序。由于my_program.exeone_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

,或多或少是人们能想到的最糟糕的虚假空间位置。

相关内容