Linux下的Bash:您所不知道的五件事

日期: 2010-05-06 作者:James Turnbull翻译:鬼谷 来源:TechTarget中国 英文

在我刚开始使用Linux不久,我试图学习一些bash命令,于是我敲下了如下的命令:   $ man bash   我立即发现bash用户手册简直就是一个长篇史诗。一页又一页的命令、功能说明、小技巧、小说明以及非常多的环境变量。20年过去了,我到现在还是能经常在bash中发现一些新的工具和功能 ,我不知道称呼Bash为一个工具是不是比一个代码更为恰当。在这篇文章中我将介绍Bash的五个不常用(但是还是非常有用)的特性。

  一、扩展字段匹配   首先我们来看一个叫做扩展字段匹配的功能。这个选项允许你执行比标准Bash所提供的更复杂的字段匹配。例如,你可以定位除了后缀为.tmp之外的所有文件。扩展……

我们一直都在努力坚持原创.......请不要一声不吭,就悄悄拿走。

我原创,你原创,我们的内容世界才会更加精彩!

【所有原创内容版权均属TechTarget,欢迎大家转发分享。但未经授权,严禁任何媒体(平面媒体、网络媒体、自媒体等)以及微信公众号复制、转载、摘编或以其他方式进行使用。】

微信公众号

TechTarget微信公众号二维码

TechTarget

官方微博

TechTarget中国官方微博二维码

TechTarget中国

电子邮件地址不会被公开。 必填项已用*标注

敬请读者发表评论,本站保留删除与本文无关和不雅评论的权力。

在我刚开始使用Linux不久,我试图学习一些bash命令,于是我敲下了如下的命令:

  $ man bash

  我立即发现bash用户手册简直就是一个长篇史诗。一页又一页的命令、功能说明、小技巧、小说明以及非常多的环境变量。20年过去了,我到现在还是能经常在bash中发现一些新的工具和功能 ,我不知道称呼Bash为一个工具是不是比一个代码更为恰当。在这篇文章中我将介绍Bash的五个不常用(但是还是非常有用)的特性。

  一、扩展字段匹配

  首先我们来看一个叫做扩展字段匹配的功能。这个选项允许你执行比标准Bash所提供的更复杂的字段匹配。例如,你可以定位除了后缀为.tmp之外的所有文件。扩展字段匹配功能可
以通过shopt命令启用,或者内置的shell选项:

  $ shopt -s extblob

  备注:你还可以运行shopt命令来查看其它选项、特性和它提供的一些秘密功能。

  一旦启用,我们可以用一个简单的语法列出某个目录中除去后缀为.tmp的所有文件:

  $ ls !(*.tmp)

  你还可以使用多个参数:
 
  $ ls !(*.tmp|*.log|*.bak)

  你可以选择使用其它几个extglob的参数,比如:

?(pattern-list) Matches zero or one occurrence of the given patterns
*(pattern-list) Matches zero or more occurrences of the given patterns
+(pattern-list) Matches one or more occurrences of the given patterns
@(pattern-list) Matches exactly one of the given patterns
!(pattern-list) Matches anything except one of the given patterns

  二、cdspell shell选项

  Cdspell是另一个很有用并且少为人知的shell命令。Cdspell命令可以更正在cd命令中出现的小的拼写错误。你可以通过shopt命令行来启用cdspell选项。

  $ shopt -s cdspell

  举个例子,现在我们试着输入一个简单的关于更改目录的错误命令:

  $ cd /ect

  /etc

  很快你能发现这个小错误被自动更正过来了,并且bash已经让你成功更改到了正确的目录下。

  $ pwd
  /etc

  Cdspell选项可以自动更正字母顺序拼写错误的单词,漏了字母的单词,还可以去掉单词中多余的字母。

  三、更好地管理Bash命令历史记录

  Bash中最有用的功能之一就是可以自动记忆你曾经使用过的命令。你可以用history命令来列出一系列之前执行过的命令。然后你可以在bash shell中用叹号标注来找回并且执行之
前的命令。例如,你可以从历史记录中通过数字列出某条命令:

  $ !110

  这样可以运行历史记录中的第110条命令。或者你也可以通过名称来指定某条命令:

  $ !wget

  这样执行最近的一条wget命令。

  以下这种用法很少人知道:

  $ !:0

  这可以返回之前执行过的命令行中的命令字段,例如:

  $ wget http://www.google.com
  $ !:0
  $ wget

  如果不需要命令,只需要返回命令之后的参数,你可以用这个命令:

  $ mkdir /tmp/newdirectory
  $ cd !*
  cd /tmp/newdirectory

  然后,你的历史记录有可能因为重复使用而变得混乱,而且你会希望只返回一些比如ls或者ps命令这样的结果。Bash有一个叫做$HISTIGNORE的环境变量,它可以只记忆那些你想要
的命令,而不是所有命令。让我们看看我的$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用户来说比较熟悉,就像
Emacs一样,你可以用Ctrl-a和Ctrl-e到达命令行的开始或者结尾,象其它快捷键一样)。这会启动以下命令:

  (reverse-i-search)`':

  然后你可以输入一个命令或者命令的一部分来搜索你的Bash历史命令,系统会列出匹配的命令。如果找到你需要的命令你可以通过敲击回车键来运行它或者敲ESC键来编辑匹配
的命令行。

  五、非别名命令

  多数人都知道如何使用别名命令,它允许你创建自定义版本的命令,比如给rm命令加一个-r参数,或者给mkdir加一个-p参数:

  $ alias rm='rm -r'
  $ alias mkdir='mkdir -p'

  你也可以不加标记的运行一个别名命令来获得一个当前可用的别名命令列表。

  但是你可能不知道非别名命令。这可以让你在无需别名的情况下运行一个命令:

  $ unalias rm /tmp/file

  你还可以用参数来获得相同的结果:

  $ rm /tmp/file

  这将执行rm命令,而不需要象在别名命令中一样手动去加-r参数。

作者

James Turnbull
James Turnbull

暂无

翻译

鬼谷
鬼谷

相关推荐