但是,上面的那些机制存在一个缺点:shell 总在命令执行前,试着进行扩展。有时候,会变得很棘手:
l 文件名包含特殊字符。假设您在那个目录中还有一个名为'!56.bak'的文件。下面试图进行模式匹配:
rm !*
rm
rm: too few arguments
shell 将'!*'解释成历史记录的替换(加入前一个命令的所有参数),而不是匹配方式。
l 命令本身带特殊字符作参数。一些 Linux 下的命令行工具,比如 (e)grep、sed、awk、find 及 locate ,都使用自己的正则表达式(regular expressions)。这些表达式与模式匹配看起来惊人地相似,但在某些地方又有所不同。
但为了使这些特殊命令生效,shell 就不能先将其当作模式匹配来解释:
find . -name [1-9]* -print
find: paths must precede expression
应该是:
find . -name '[1-9]*' -print
./346.bak
./124.bak
./583.bak
./311.bak~
您可以通过反斜线(back slash)来引用特殊字符,比如 ! 、$ 、? 或空格:
ls !*
!56.bak
或者用(单)引号:
ls '!'*
!56.bak
请注意,要看清楚引号应该放在什么位置。命令 ls '!*' 将查找名为'!*'的文件,这是由于通配符也在引号间,所以只能依照字面来解释。
三、输出重定向
Unix 的理念是汇集许多小程序,每个东东都有特殊的专长。复杂的任务不是由大型软件完成,而是运用 shell 的机制,组合许多小程序共同完成。重定向就在其中发挥着重要的作用。
1、在多个命令间重定向
这要通过管道(pipe),由管道符号|来标识。语法是:
command1 | command2 | command3 等等
这种格式您一定已经见到过了。管道经常将一个程序的输出送到'more'或'less'来阅读。
ls -l | less
其中,第一个命令提供目录内容,第二个则将其以翻页的方式显示。更复杂的例子如:
rpm -qa | grep ^x | less
第一个命令给出所有已安装的 RPM 包,第二个则将其过滤(filter:'grep'),只剩下以'^x'开头的包,第三个命令则将结果以翻页的方式显示。
2、重定向至文件
有时,您希望将命令的输出结果保存到文件中,或以文件内容作为命令的参数。这可以通过'>'和'<'来实现。
command > file
将 command 的输出保存到 file 中,这将覆盖 file 中的内容:
ls > dirlist
将当前目录的内容保存到'dirlist'文件。
command < file
将 file 内容作为 command 的输入:
sort < dirlist > sdirlist
将文件'dirlist'的内容送到命令'sort',然后再将排序后的结果送到文件'sdirlist'。当然,您也可以一步到位:
ls | sort > sdirlist










