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