星号在 Unix 中作为独立命令的功能是什么?

use*_*585 21 linux unix bash command-line

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

我最好的猜测是 Unix 将其视为通配符,因此它执行了第一个字母程序。由于my_program.exeone_of_my_programs.program可以通过简单地输入文件名来执行,通配符代表所有可能的文件。由于程序首先按字母顺序排列,Unix 会执行它。这是一个正确的判断吗?

AFH*_*AFH 20

你的解释是正确的。其余文件将作为其参数列表显示。

请注意,仅当程序设置了可执行位并且当前目录在PATH列表中时,它才会执行此操作。

一些可能有助于理解的注释:-

  • 如果您键入,./*则该PATH条目不是必需的。
  • 如果您键入. *or. ./*并且第一个匹配的文件是一个脚本,那么它不需要是可执行的,也不需要当前目录在其中PATH(对于除 之外的 shell 可能不是真的bash)。

  • “它只会这样做……”——它可以更有趣。如果在 `PATH` 中存在与第一个文件同名的 shell 函数、内置函数或可执行文件,则将执行另一个命令。`mkdir foo; cd foo; 触摸 rm xyz; ls; *; ls`。 (10认同)

小智 11

这表明这.是您的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$ 
Run Code Online (Sandbox Code Playgroud)

如您所见,执行的不是rm当前目录(一个空且不可执行的文件),而是系统默认的/bin/rm.

当涉及通配符时,请务必仔细检查您的命令。这是有史以来最可怕的消息之一:

rm: cannot remove '.o': No such file or directory
Run Code Online (Sandbox Code Playgroud)

这是调用的结果

rm * .o
Run Code Online (Sandbox Code Playgroud)

,或多或少是人们可以想出的最糟糕的虚假空间布局。

  • +1 表示“这是有史以来读过的最可怕的消息之一”。 (3认同)