不经常,但经常足以惹恼我,当我将字符串*G*
放入变量并“回显”它时,我看到一些文件名,通常来自目录中的文本文件BASH很有针对性。我认为这可能是一个自动完成的功能,但我在这些方面找不到任何东西。当我用字符组合回显一个字符串时,有人能告诉我发生了什么吗?如果可能的话,我想“关掉它”。
答案 0 :(得分:3)
这是一张外卡,它将当前目录中的所有文件与其名称中的字符G
进行匹配。
this section的Bash Reference Manual中解释了这一点。
如果您确实要禁用它,可以使用:
set -f
或
set -o noglob
解释here
但它是一个非常有用的功能,我鼓励你启用它并学会使用它。
如果要为单个命令关闭它,可以使用引号或反斜杠转义任何特殊字符:
echo '*G*'
echo "*G*"
echo \*G\*
顺便提一下,此功能并非特定于echo
命令;它适用于shell中的所有命令。例如:
ls *.txt
为您提供名称以.txt
结尾的所有文件的目录列表。
答案 1 :(得分:1)
这是一个通配符文件名,*G*
只表示任意数量的字符(零个或多个),后跟G
后跟任意数量的字符。
换句话说,其中包含G
的任何文件名。如果没有文件中包含G
,bash
只会根据以下成绩单为您提供原始字符串:
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