Bash Expansion

用SHELL的视角看世界

展开(expansion)

每次在你在终端上敲好命令按下回车键的时候,bash在执行这些命令之前已经对你敲下的这些文字做了些处理.比如”*“,对shell来说可能具有很多含义.产生这种效果的处理过程,叫做展开(expansion).在shell执行你输入的命令之前,它可以把你输入的东西,展开成另外一些东西.为了具体说明,我们先看一下 echo 这个命令.echo 是shell内置的命令,他的功能很简单,就是把其参数输出到标准输出(终端)上.

wentao@wentao-laptop:~$ echo this is a test
this is a test

这个例子非常简单,传给echo命令的所有参数都被显示在终端上了,再看另外一个例子:

wentao@wentao-laptop:~$ echo *
Desktop Documents Music Templates Public Videos

发生了什么呢?为什么echo没有把*显示在终端上?这是因为在echo命令执行之前,shell把*展开成了其他一些东西(这个例子中,是当前工作目录中的文件的文件名).当按下回车后,在执行命令之前,shell自动展开命令中所有的符合条件的字符,所以echo命令就压根没有见到过*,它见到的只有被shell展开后的结果.

路径名展开

*(通配符)的展开机制叫做”路径名展开(pathname expansion)”.例如,我们在如下的工作目录中:

wentao@wentao-laptop:~$ ls
Desktop Pictures Templates Documents Music Public Videos test.txt

我们可以执行如下的展开:

wentao@wentao-laptop:~$ echo D*
Desktop Documents

或者:

wentao@wentao-laptop:~$ echo *s
Pictures Templates Documents Videos

甚至:

wentao@wentao-laptop:~$ echo [[:upper:]]* 
Desktop Pictures Templates Documents Music Public Videos

还有:

wentao@wentao-laptop:~$ echo /usr/*/*bin
/usr/bin/prezip-bin /usr/local/bin /usr/local/sbin /usr/share/libc-bin

注*: 原文出自『THE LINUX COMMAND LINE』

总结: