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


21

我在Red Hat Linux的终端上乱七八糟,当我输入星号(*)并返回时,它执行了我目录中的程序之一。为什么?

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


我认为并不是所有的shell都*按字母顺序对扩展名进行排序,但是bash就是这样做的。
aschepler

1
@aschepler:所有符合POSIX的外壳程序都必须;见pubs.opengroup.org/onlinepubs/9699919799/utilities/...第3
dave_thompson_085

Answers:


20

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

请注意,只有在程序中设置了可执行位并且当前目录在PATH列表中时,它才会这样做。

一些注意事项可能有助于理解:

  • 如果键入,./*PATH条目不是必需的。
  • 如果键入. *或,. ./*并且第一个匹配文件是脚本,则它不必是可执行文件,也不需要当前目录PATH(对于以外的shell可能不是正确的bash)。

10
“它只会这样做……” –可能会更有趣。如果存在一个shell函数,内置函数或一个PATH与第一个文件同名的可执行文件,则将执行该另一个命令。mkdir foo; cd foo; touch rm xyz; ls; *; ls
卡米尔Maciorowski

@KamilMaciorowski-公平的一点:我的声明“它只会这样做……”指定了必要条件,但没有足够条件。如果*是别名,该命令的行为也将有所不同。
AFH

1
结论:不要这样做!即使您认为可以依靠全局扩展字母顺序,也请注意,该顺序取决于语言环境。
亚伦

除了一个. *. ./*一个罐头bash *(或任何其他壳)。
奥利维尔·杜拉克

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$ 

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

涉及通配符时,请始终仔细检查您的命令。这是有史以来最恐怖的消息之一:

rm: cannot remove '.o': No such file or directory

这是打电话的结果

rm * .o

,或多或少会导致虚假空间的最坏放置。


1
创建一个rm()添加-i到参数或检查参数并要求确认是否超过一定数量的函数,这没有什么坏处。
AFH

3
为“这里是有史以来最恐怖的消息之一” +1。
Mehrdad

+1表示“出于安全考虑,这是一个非常糟糕的主意(自然,Windows必须将其设为不可修改的默认值)。”
邓肯·辛普森

FTFY:mv /tmp/ohno /tmp/ohnoesgoogle.fr/search?q=ohnoes&source=lnms&tbm=isch
Olivier Dulac

Windows将其设置为不可修改的默认值是有充分的理由的。从DOS实施目录的那一天开始,它就必须保持向后兼容性。请记住,那些日子里,没有人使用PC来安装硬盘,而软盘又很小,以至于最初并不认为目录是必需的。
Muzer's
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.