未加星标

[译]Bash Shell高级编程如何提高你的工作效率(上)

字体大小 | |
[系统(linux) 所属分类 系统(linux) | 发布者 店小二03 | 时间 2016 | 作者 红领巾 ] 0人收藏点击收藏

原文: Advancing in the Bash Shell

译者:杰微刊兼职翻译刘晓鹏

如果你曾使用过GNU/linux,你应该有很好的机会使用bash。有些人坚信使用GUI比CLI更快。这部分人显然从来没有见到过熟练使用shell的人。在本教程中,我希望能向你展示一小部分bash提供的让你为之震惊的功能,shell中的这些功能将大大提高你的生产效率。

!!(bang bang)与history

每个人都知道bash的history命令,对吧?你可能会很惊讶。大多数现代源自bash的版本都可以使用history。如果你以前从来没有使用过,试着通过上下箭头来查看你的命令历史。向上箭头将从最新到最老循环滚动历史命令,而向下箭头则以相反的方向滚动。

幸运的是,虽然不同的终端对箭头键的处理不同,但聪明的bash开发者想出了访问和使用history命令的其他方法。我们将从history命令开始。这个命令简单的输出你输入过的历史命令及编号列表,越老的命令,编号越小。简单吧?

这是history命令的一个输出示例:

ps -axu | grep htt
/www/bin/apachectl start
vi /usr/local/libphp.ini
cat /www/logs/error_log
ps -auxw | grep http
pwd

这给我们引出了!!命令,!!告诉bash“重复执行我上一次输入的命令”。但是它的魅力不仅仅如此,你还可以使用!xyz。!xyz将运行最后一条你输入过的以xyz开头的命令。不过请确保在简写形式中增加足够的信息以保证唯一性,否则你的运行可能会出问题,例如:在上面的例子中,ps运行了两次,然后是pwd。如果你输入!p,则会获取到pwd的输出结果。输入!ps,这就有足够的信息保证唯一,所以将会执行历史命令中的 ps -auxw | grep http命令。通过输入足够的信息来保证历史命令的唯一性,这就可以更加准确的命中你的目标命令。

:p 不仅仅是一个情感符号

如果你需要非常确定你执行命令的目标,:p将会是一个很好的帮助。!xyz:p会打印你将要执行的命令,而不是直接执行该命令。:p还能聪明的将打印的命令作为最后一个命令(即使它没有执行)添加到你的历史命令列表中,所以,如果你决定要执行打印的命令,只需要!!命令就可以完成了。

Bash 还提供了两个查找历史命令的方法。这两者在不同的情况下都是非常有用的。第一个方法是输入history命令,再找到你想要执行命令的序号,然后再输入!N(这里的N即为你想要执行命令的序号)。(:p在这中情况也是有效的)。另一个方法稍微复杂一点,但是也更灵活。按下^r (ctrl-r)后可以通过字符串查找历史命令。这种方式的好处你可以在执行命令之前对其进行编辑。第二种方法更强大,但在执行一些重复性的任务时,!22这种方式会比通过ctrl-r来搜索命令(甚至比箭头键)更容易记住。

!$符号

!$表示上一个命令的“末尾”。思考一下以下的列子:我们从文件中查找一个单词

$grep -i joe /some/long/directory/structure/user-lists/list-15

如果joe在userlist中,我们想将其从删除。我们可以将这个长的目录树作为参数传递给vi命令,或者简单的:

$vi !$

该命令在bash中扩展为:

$vi /some/long/directory/structure/user-lists/list-15

注意:!$代表前一条命令末尾的单词(word)。什么是一个单词?Bash手册将“一个可以作为shell执行单位的字符序列”称之为单词。如果你没有做任何改变,一个被引用的字符串或者是由空白符(可能是一个tab或者一个空格等)分割的字符组即为一个单词。什么是一个空格分割的字符组?一个字符组即由空白字符(可能是一个tab或是一个空格等)与其他字符分割的字符序列。如果你不是很肯定,也可以:p来确认。

另外一件需要记住的事情是在使用!$时,如果前一条命令没有参数,!$表示前一条命令而不是最近的参数。这个可能会很方便,例如,如果你输入文件名的时候忘记了输入vi了。你只需要简单的输入vi !$即可。

与!$类似的是!*。!*代表前一条命令的所有参数,而不仅仅是最后一个。这在很多情况下都是很有用的,这是一个简单的示例:

$ vi cd /stuff #(oops!)
[exit vi twice]
$ !*
这在bash中扩展为:
$cd /stuff

扬抑符“帽子”(^)

你是否曾经遇到过这样一种情况:输入完一条命令,回车后立马意识到你犯了一个错误?我以前使用more分页命令时,我总是输入:

$mroe filename

幸运的是,bash的作者也不是最伟大的打字员。在bash中,你可以通过扬抑符(^)来修订上一条命令。

参考如下示例:

$ vi /etc/Somefile.conf #(oops!)
$ ^f^F

这在bash中会转换成:

$vi /etc/SomeFile.conf

这中间发生了什么?我要编辑的文件名是 /etc/SomeFile.conf(注意大写字母“F”),但是我输入了小写字母“f”,vi根据我的错误命令创建了一个新的文件。当我退出vi命令时,我可以通过如下的形式来修订我错误:^错误^正确。需要注意的是这里只修改第一个“f”,而不修改第二个。如果你需要进行全局替换,你需要使用不同的history修饰符,这将在下列的“词的修饰符”章节中进行讨论。

帽子符(^)不仅仅用于错误修订。现在我告诉几条通配符无法处理的命令,^将能很好的帮你实现。例如:

$ dd if=kern.flp of=/dev/fd0
$ ^kern^mfsroot

bash会将其转换为:

$ddif=mfsroot.flp of=/dev/fd0

啊哈,多么美好的日子!

几个方便的移动命令

有的时候,在按下回车键之前就意识到了错误。我们已经说过终端无法正常的处理光标键,所以,我们该如何处理这种错误呢?更槽糕的时候,有时退格键还被映射成^H或者^[[~。现在,如何在回车之前解决你的错误呢?

bash再一次帮我们解决了这类问题。下面是我在移动光标的过程中最常使用的按键:

^w删除一个单词

^u 删除从行头到当前位置的字符(我一直在使用这个)

^a 将光标移动到行头

^e 将光标移动到行尾

虽然还有更多的命令,但对于上面这些命令,你如果不知道,简直没办法轻松的活下去。对于那些还不知道^N就代表ctrl+N操作的人,千万别把它与上述的“帽子”搞混了。

Tab-tab(制表键―制表键)

bash中我最喜欢的特性之一是tab补全。Tab补全通过两种方式来实现,它可以补全当前目录下的文件名称或$PATH下的命令。类似上述的!命令,你只需要告诉bash足够确定文件名唯一的标识,再按tab键,bash将会替你补全剩余的部分。现在假设在你的家目录下有一个名为ransom.note的文件,考虑一下如下情况:

$mor[tab] ran[tab]

将会被扩展为:

$more ransom.note

假设在你的家目录下还有一个名为random的文件。ran 就不是足够长的,因为它无法唯一确认一个文件,但是你比较幸运,如果你连按两次tab键,bash将会在屏幕上列出所有匹配的文件,这样你可以清楚的看到你需要增加什么来确保唯一。

未 完 待 续 。。。。。

本文系统(linux)相关术语:linux系统 鸟哥的linux私房菜 linux命令大全 linux操作系统

分页:12
转载请注明
本文标题:[译]Bash Shell高级编程如何提高你的工作效率(上)
本站链接:http://www.codesec.net/view/482263.html
分享请点击:


1.凡CodeSecTeam转载的文章,均出自其它媒体或其他官网介绍,目的在于传递更多的信息,并不代表本站赞同其观点和其真实性负责;
2.转载的文章仅代表原创作者观点,与本站无关。其原创性以及文中陈述文字和内容未经本站证实,本站对该文以及其中全部或者部分内容、文字的真实性、完整性、及时性,不作出任何保证或承若;
3.如本站转载稿涉及版权等问题,请作者及时联系本站,我们会及时处理。
登录后可拥有收藏文章、关注作者等权限...
技术大类 技术大类 | 系统(linux) | 评论(0) | 阅读(41)