对话 UNIX:第 2 部分: 做得多不如做得巧( 三 )


第 4 个命令仅查找那些 4 个字母后跟点号和单个字符的项目 。最后 , 命令 5 查找这样的项目:以小写字母 a、b 或 c 开头 , 后面至少跟一个字母 , 然后可以是任何内容 , 接着是点号和任何后缀 。正如所看到的 , 您可以根据实际情况重复使用这些通配符匹配操作符 。
清单 3. 通配符示例
1 $ ls -1 -a -F
./libs
ChangeLog
ChangeLog-branches/
Makefile
Makefile.in
alloca.c
ansi2knr.c
cmpt.c
cmpt.o
config.h
config.h.in
connect.c
connect.h
connect.o
convert.c
convert.h
convert.o
...
wget*
2 $ ls -a -F .*
./lib
3 $ ls -1 *.?
alloca.c
ansi2knr.c
cmpt.c
cmpt.o
config.h
connect.c
connect.h
connect.o
convert.c
convert.h
convert.o
...
4 $ ls -1 ????.?
cmpt.c
cmpt.o
5 $ ls [a-c]?*.*
alloca.c
ansi2knr.c
cmpt.c
cmpt.o
config.h
config.h.in
connect.c
connect.h
connect.o
convert.c
convert.h
convert.o
cookIEs.c
cookies.h
cookies.o
那么 , ls *.z 将会产生什么样的结果呢(假设不存在这样的文件)?它将产生一条有用的错误消息:
$ ls *.z
zsh: no matches found: *.z
关于(命令)历史
到目前为止 , 您已经了解了如何指定路径和选择相应的文件 。您可以在命令行中描述需要完成的任务 。然而 , 即使所有的命令行都很短并且很简单 , 但您仍然有可能对反反复复地输入这些相同的内容而感到厌烦 。尤其是 , 您可能厌倦了输入冗长的、复杂的命令行 , 其中可能包含大量的选项、或者参数的顺序有严格的要求 。幸运的是 , 大多数 Shell 都维护了以前命令的历史 。要再次运行一个命令 , 只需从这个历史列表中找到相应的条目 , 然后再次运行它 。与 Shell 中其他的部分一样 , 通过快捷方法可以快速和轻松地进行引用 。
要在 Z Shell 中启用命令历史 , 可以输入:
$ HISTSIZE=500
$ SAVEHIST=500
这里的命令指定了 Shell 和持久化历史文件应该保留最后的 500 条命令 。(在缺省情况下 , Z Shell 仅保存最后的 30 条命令 。)有关如何捕获和保存命令历史的信息 , 请查看您的 Shell 文档 。
在 Shell 中进行了一段时间的工作之后 , 您只需输入 history 就可以查看命令历史:
$ history
...
781 /bin/ls -d */
782 /bin/ls -F *(/)
783 /bin/ls -d -F *(/)
784 /bin/ls -d -F */
785 /bin/ls -d */
您所运行的每个命令都会分配到一个顺序的数值标识符 。您可以使用这个标识符 , 如 782 , 来引用完整的命令和命令中的某些部分 。要再次运行一个命令 , 可以输入 !(感叹号)加上命令对应的数值:
$ !785
ChangeLog-branches/ doc/ po/ src/ util/ Windows/
如果您希望从一个历史命令中获得特定的参数 , 可以使用 !(感叹号)来引用这个命令 , 并提供 :N , 其中 0 表示命令名 , 1 表示第 1 个参数 , 依此类推 。例如 , 要提取历史日志中命令 782 的第二个参数 , 可以输入清单 4 中所示的代码 。
清单 4. 提取命令 782 的第二个参数
$ echo !782:2 
echo *(/)
ChangeLog-branches doc po src util windows
$ ls AUTHORS COPYING INSTALL MacHINES
AUTHORSCOPYINGINSTALLMACHINES
$ echo !!:3
echo INSTALL
$ history -2
788 ls AUTHORS COPYING INSTALL MACHINES
789 echo INSTALL
$ echo !788^
echo AUTHORS
AUTHORS
$ echo !788$
echo MACHINES
MACHINES
命令 history -2 打印出前两个命令 。作为快捷方法 , 您可以使用 ^(脱字符号)引用命令的第一个参数(而不是命令名本身) , 并且您可以使用 $(美元符号)引用历史命令的最后一个参数 。您还可以使用范围符号来引用某个范围的参数 , 如清单 5 所示 。

推荐阅读