gpt4 book ai didi

linux - Bash:使用文件名作为带通配符的命令

转载 作者:塔克拉玛干 更新时间:2023-11-03 00:10:13 25 4
gpt4 key购买 nike

我之前在我的终端上玩过,发现我可以通过创建一个与命令。但是,我不能执行'多字'命令('rm\-rf *','ls -a', 'python2.7\test.py')(这也让我发现你不能使用“rm -rf *”删除名为“-rf”的目录)除非参数按字母顺序排列。看起来,当您将 * 传递给 bash 时,它会按字母顺序读取文件/目录的名称,并将每个连续的名称作为参数传递给前一个命令。示例:

$ mkdir cat
$ touch dog
$ vim dog # at this point I put 'Hello!' into dog
$ *
Hello!

为什么通配符不能执行带空格的文件的命令,却可以执行多个文件名的命令?谢谢!

编辑:别名也由于某种原因不起作用。示例:

$ alias lsa='ls -a'
$ mkdir lsa
$ *
No command 'lsa' found, did you mean:
...
lsa: command not found

谁知道这是为什么?

最佳答案

在 bash 解释并对结果采取行动之前,bash 处理的每个命令都经过多种扩展。最后一个是路径名扩展,其中 bash 检查命令的单词(由先前的扩展和分词产生)是否包含任何未加引号的特殊字符 *?[,并将这些词解释为表示文件名的模式。执行所有扩展后,将执行扩展命令中的任何重定向和变量赋值,并从命令中删除。如果还有任何单词,则第一个单词将作为要运行的命令的名称。这个词的出处并不重要。

在路径名扩展中,* 匹配任何字符串,包括空字符串。当 bash 对仅包含 * 的单词执行路径名扩展时,它会扩展为工作目录中所有文件的名称,但以点 (.) 开头的文件除外.

因此,如果您的工作目录仅包含一个名为 ls 的文件,并且您执行命令 *,bash 将该命令扩展为 ls 并执行它,产生输出 ls。同样,如果目录的内容是echoHello,World!,那么当你执行命令* bash 将其扩展为 echo Hello, 'World!',命令输出 Hello, World!

对于其中包含空格的文件名,这并不像您认为的那样有效,因为每个与模式匹配的文件名都被扩展为单个单词。这些随后不会拆分。 (Bash 确实在扩展过程中执行“分词”,但这发生在 路径名扩展之前。)这通常是您想要的,否则命令如 rm * 不会可靠地做你期望的事情。

这不适用于别名,因为 bash 在它读取 命令时扩展别名,而不是在执行它们时。这有几个含义,但其中之一是在执行任何扩展之前解释别名。另一个是别名的替换文本受所有正常扩展的约束。

关于linux - Bash:使用文件名作为带通配符的命令,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38382238/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com