【发布时间】:2013-03-24 13:10:52
【问题描述】:
不经常,但经常让我烦恼,当我将字符串 *G* 放入变量中并“回显”它时,我看到一些文件名,通常来自 BASH 所在目录中的文本文件尖。我认为这可能是一个自动完成功能,但在这些区域我找不到任何东西。有人能告诉我当我用这种字符组合回显一个字符串时发生了什么吗?如果可以的话,我想“关闭它”。
【问题讨论】:
-
*在通配时为 0 个或多个字符。
不经常,但经常让我烦恼,当我将字符串 *G* 放入变量中并“回显”它时,我看到一些文件名,通常来自 BASH 所在目录中的文本文件尖。我认为这可能是一个自动完成功能,但在这些区域我找不到任何东西。有人能告诉我当我用这种字符组合回显一个字符串时发生了什么吗?如果可以的话,我想“关闭它”。
【问题讨论】:
* 在通配时为 0 个或多个字符。
这是一个通配符文件名,*G* 仅表示任意数量的字符(零个或多个)后跟 G 后跟任意数量的字符。
换句话说,任何带有G 的文件名。如果 no 文件中包含 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*
您可以将其关闭,只需阻止外壳扩展文件名即可:
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
【讨论】:
这是一个通配符,将当前目录中的所有文件与名称中的字符 G 匹配。
在Bash Reference Manual 的this section 中有解释。
如果你真的想禁用它,你可以使用:
set -f
或
set -o noglob
如解释here
但这是一个非常有用的功能,我鼓励您保持启用状态并学习使用它。
如果你想为单个命令关闭它,你可以用引号或反斜杠转义任何特殊字符:
echo '*G*'
echo "*G*"
echo \*G\*
顺便说一下,此功能并非特定于echo 命令;它适用于 shell 中的 all 命令。例如:
ls *.txt
为您提供名称以.txt 结尾的所有文件的目录列表。
【讨论】:
*G* 是什么意思?