Linux Shell简介

2019-09-23 09:45:46王冬梅



但是,上面的那些机制存在一个缺点: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