Bash 何时在linux shell命令中引用字符串?

Bash 何时在linux shell命令中引用字符串?,bash,quoting,Bash,Quoting,我发现一些与bash命令不一致的地方,我想澄清一下 这里提到的一条评论说。但是为什么命令 find . -name *.txt 没有获得错误,应该使用通配符扩展输出 我还找到了一个很好的页面来解释,。但是为什么在正则表达式中使用单引号不能打破它呢? 比如说 find . -regex '.*x.txt' 为什么这样做有效,而不查找字面上称为*.txt cheerr在调用命令行中包含的命令之前,shell将展开无引号的模式(其中模式是包含模式元字符的单词,如*)。在本例中,find-name*

我发现一些与bash命令不一致的地方,我想澄清一下

这里提到的一条评论说。但是为什么命令

find . -name *.txt
没有获得错误,应该使用通配符扩展输出

我还找到了一个很好的页面来解释,。但是为什么在正则表达式中使用单引号不能打破它呢? 比如说

find . -regex '.*x.txt'
为什么这样做有效,而不查找字面上称为
*.txt


cheerr

在调用命令行中包含的命令之前,shell将展开无引号的模式(其中模式是包含模式元字符的单词,如
*
)。在本例中,
find-name*.txt
可能扩展为
find-名称a.txt b.txt c.txt
,在这种情况下,只有
a.txt
查找
命令的
-name
主参数。为了防止这种扩展,请引用
*.txt
,因为您希望该文本字符串作为参数

find . -name '*.txt'
find
本身使用模式来匹配递归当前目录时找到的每个文件


bash
让您有点懒惰,因为如果
*.txt
实际上不匹配任何内容,那么默认情况下它将被视为文本字符串。有一些shell选项可以更改此行为:
nullglob
会导致不匹配的模式消失,就好像它从未存在过一样;
failglob
会导致shell引发错误。但是,最好是明确的:如果您不希望字符串进行路径名扩展,请在调用命令行中包含的命令之前引用它以确保它无法扩展。

shell将扩展未引用的模式(其中模式是包含模式元字符的单词,如
*
)。在本例中,
find-name*.txt
可能扩展为
find-名称a.txt b.txt c.txt
,在这种情况下,只有
a.txt
查找
命令的
-name
主参数。为了防止这种扩展,请引用
*.txt
,因为您希望该文本字符串作为参数

find . -name '*.txt'
find
本身使用模式来匹配递归当前目录时找到的每个文件


bash
让您有点懒惰,因为如果
*.txt
实际上不匹配任何内容,那么默认情况下它将被视为文本字符串。有一些shell选项可以更改此行为:
nullglob
会导致不匹配的模式消失,就好像它从未存在过一样;
failglob
会导致shell引发错误。但是,最好是明确的:如果您不打算对字符串进行路径名扩展,请引用它以确保其无法扩展。

这与主题无关,因为它与编程无关。但是,请注意,如果shell通配符模式与任何内容都不匹配,则它将按原样传递给应用程序。您需要仔细考虑shell扩展的内容与应用程序处理的内容之间的区别。编写一个小实用程序,只打印它的参数,并尝试用不同的东西调用它。必要时。一旦你知道了引用的实际用途,你就可以很容易地判断出它是什么时候必要的,什么时候不必要。它可以是关于编程的。编写shell脚本是编程的一种形式。然而,它是非常广泛的。(当然标题中的问题是……)这是离题的,因为它与编程无关。但是,请注意,如果shell通配符模式与任何内容都不匹配,那么它将按原样传递给应用程序。您需要仔细考虑shell扩展的内容与应用程序处理的内容之间的区别。编写一个小实用程序,只打印它的参数,并尝试用不同的东西调用它。必要时。一旦你知道了引用的实际用途,你就可以很容易地判断出它是什么时候必要的,什么时候不必要。它可以是关于编程的。编写shell脚本是编程的一种形式。然而,它是非常广泛的。(当然标题中的问题是……)我;我只是在阅读我之前链接中的单票对双票的引用。在他的例子中,#11他说,全球化在任何类型的引用字符串中都不起作用。那么,为什么它在人们编写的每一个脚本(比如“*.txt”)中都能正常工作呢?@123:globbing在shell中不能在带引号的字符串中工作是正确的。但是
find
不是shell的一部分,它是一个具有自己的全局搜索系统的外部程序。传递
find
必须引用
'*.txt'
的参数,因为在调用外部
find
程序之前,shell会对其进行解析。如果未对其进行保护,则外壳将在启动
find
之前跳入并展开它。@cdarke有趣的是,如何区分内部程序和外部程序之间的差异。内部程序只是我们自己编写的脚本,外部程序是在操作系统中预编译的吗?不,内部命令是由shell本身实现的。有些不能作为外部命令实现(如
cd
,它改变了shell的状态),而另一些可以作为其中之一实现(如
test
,两者都存在;内部版本更有效,因为它不需要分叉新的进程)。shell的文档(例如手册页)将列出受支持的内置内部命令。正如@chepner所说,但是发现命令是内置的还是外部的一种简单方法是使用
type
命令。试试
键入cd
键入echo
键入ls
键入find
键入[[
。如果你得到
哈希值
,这意味着它是一个缓存路径的外部程序。我只是从以前的链接中读取单引号和双引号。在他的考试中