* G *在bash echo中意味着什么?

时间:2013-04-03 02:08:15

标签: string bash replace echo

不经常,但经常足以惹恼我,当我将字符串*G*放入变量并“回显”它时,我看到一些文件名,通常来自目录中的文本文件BASH很有针对性。我认为这可能是一个自动完成的功能,但我在这些方面找不到任何东西。当我用字符组合回显一个字符串时,有人能告诉我发生了什么吗?如果可能的话,我想“关掉它”。

2 个答案:

答案 0 :(得分:3)

这是一张外卡,它将当前目录中的所有文件与其名称中的字符G进行匹配。

this sectionBash Reference Manual中解释了这一点。

如果您确实要禁用它,可以使用:

set -f

set -o noglob

解释here

但它是一个非常有用的功能,我鼓励你启用它并学会使用它。

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

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

顺便提一下,此功能并非特定于echo命令;它适用于shell中的所有命令。例如:

ls *.txt

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

答案 1 :(得分:1)

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

换句话说,其中包含G的任何文件名。如果没有文件中包含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