2

不是太频繁,但经常让我烦恼,当我将字符串*G*放入变量中并“回显”它时,我会看到一些文件名,通常来自 BASH 指向的目录中的文本文件。我认为这可能是一个自动完成功能,但在这些区域我找不到任何东西。当我用这种字符组合回显一个字符串时,有人能告诉我发生了什么吗?如果可以的话,我想“关闭它”。

4

2 回答 2

3

它是一个通配符,将当前目录中的所有文件G与其名称中的字符匹配。

Bash 参考手册的这一部分对此进行了解释。

如果你真的想禁用它,你可以使用:

set -f

或者

set -o noglob

正如这里所解释的

但这是一个非常有用的功能,我鼓励您保持启用状态并学习使用它。

如果要为单个命令关闭它,可以使用引号或反斜杠转义任何特殊字符:

echo '*G*'
echo "*G*"
echo \*G\*

顺便说一下,这个特性不是特定于echo命令的;它适用于 shell 中的所有命令。例如:

ls *.txt

为您提供名称以 . 结尾的所有文件的目录列表.txt

于 2013-04-03T02:11:59.880 回答
1

它是一个通配符文件名,*G*仅表示任意数量的字符(零个或多个)后跟G任意数量的字符。

换句话说,任何带有 aG的文件名。如果其中没有包含 a 的文件Gbash只需按照以下成绩单为您提供原始字符串:

pax> mkdir qqq ; cd qqq ; touch paxfile

pax> ls -al
total 0
-rw-r--r-- 1 pax pax 0 Apr  3 10:05 paxfile

pax> echo *x*
paxfile

pax> echo *G*
*G*

您可以通过简单地阻止 shell 扩展文件名来关闭它:

pax> echo '*x*'
*x*

或者,bash有一个GLOBIGNORE变量,它包含一个以冒号分隔的文件名列表,您不想扩展这些文件名,因此您也可以使用它,尽管为任意目录设置它是相当痛苦的(而且,是的,该方法以下不适用于带有嵌入空格的文件,因此,在您抱怨之前,它仅用于演示目的):

pax> GLOBIGNORE=pax

pax> echo *x*
*x*

pax> touch xyzzy twisty ; unset GLOBIGNORE ; GLOBIGNORE=$(echo *x* | tr ' ' ':')

pax> echo $GLOBIGNORE == * # only twisty should expand here (no x)
paxfile:xyzzy == twisty
于 2013-04-03T02:10:30.233 回答