在我刚开始使用Linux不久,我试图学习一些bash命令,于是我敲下了如下的命令: $ man bash
我立即发现bash用户手册简直就是一个长篇史诗。一页又一页的命令、功能说明、小技巧、小说明以及非常多的环境变量。20年过去了,我到现在还是能经常在bash中发现一些新的工具和功能 ,我不知道称呼Bash为一个工具是不是比一个代码更为恰当。在这篇文章中我将介绍Bash的五个不常用(但是还是非常有用)的特性。
一、扩展字段匹配
首先我们来看一个叫做扩展字段匹配的功能。这个选项允许你执行比标准Bash所提供的更复杂的字段匹配。例如,你可以定位除了后缀为.tmp之外的所有文件。扩展字段匹配功能可
$ shopt -s extblob
备注:你还可以运行shopt命令来查看其它选项、特性和它提供的一些秘密功能。
一旦启用,我们可以用一个简单的语法列出某个目录中除去后缀为.tmp的所有文件:
$ ls !(*.tmp)
你还可以使用多个参数:
你可以选择使用其它几个extglob的参数,比如:
?(pattern-list) Matches zero or one occurrence of the given patterns
二、cdspell shell选项
Cdspell是另一个很有用并且少为人知的shell命令。Cdspell命令可以更正在cd命令中出现的小的拼写错误。你可以通过shopt命令行来启用cdspell选项。
$ shopt -s cdspell
举个例子,现在我们试着输入一个简单的关于更改目录的错误命令:
$ cd /ect
/etc
很快你能发现这个小错误被自动更正过来了,并且bash已经让你成功更改到了正确的目录下。
$ pwd
Cdspell选项可以自动更正字母顺序拼写错误的单词,漏了字母的单词,还可以去掉单词中多余的字母。
三、更好地管理Bash命令历史记录
Bash中最有用的功能之一就是可以自动记忆你曾经使用过的命令。你可以用history命令来列出一系列之前执行过的命令。然后你可以在bash shell中用叹号标注来找回并且执行之
$ !110
这样可以运行历史记录中的第110条命令。或者你也可以通过名称来指定某条命令:
$ !wget
这样执行最近的一条wget命令。
以下这种用法很少人知道:
$ !:0
这可以返回之前执行过的命令行中的命令字段,例如:
$ wget http://www.linuxso.com
如果不需要命令,只需要返回命令之后的参数,你可以用这个命令:
$ mkdir /tmp/newdirectory
然后,你的历史记录有可能因为重复使用而变得混乱,而且你会希望只返回一些比如ls或者ps命令这样的结果。Bash有一个叫做$HISTIGNORE的环境变量,它可以只记忆那些你想要
$ HISTIGNORE=&:history:ls:ls * ps:ps -A:[bf]g:exit
这个设置可以避免记录重复记录(&号),然后所有ls,ls*ps和ps-A,还有bg,fg和内置的exit命令都将被记录在历史列表中。另一个有用的小技巧就是加一个[ t]*参数,可以避免所有以空格开始的命令被记录在历史列表中。最后,我们只要输出它就可以了:
$ export HISTIGNORE
四、交互式历史命令搜索
你以前知道这件事情吗,就是你可以互动式地搜索你的Bash历史命令,从而更好地整理好它?你可以输入Ctrl-r来启用这个搜索功能(这个可以对Emacs用户来说比较熟悉,就像
(reverse-i-search)`':
然后你可以输入一个命令或者命令的一部分来搜索你的Bash历史命令,系统会列出匹配的命令。如果找到你需要的命令你可以通过敲击回车键来运行它或者敲ESC键来编辑匹配
五、非别名命令
多数人都知道如何使用别名命令,它允许你创建自定义版本的命令,比如给rm命令加一个-r参数,或者给mkdir加一个-p参数:
$ alias rm='rm -r'
你也可以不加标记的运行一个别名命令来获得一个当前可用的别名命令列表。
但是你可能不知道非别名命令。这可以让你在无需别名的情况下运行一个命令:
$ unalias rm /tmp/file
你还可以用参数来获得相同的结果:
$ rm /tmp/file
这将执行rm命令,而不需要象在别名命令中一样手动去加-r参数。 (责任编辑:IT) |