﻿<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/"><channel><title>IT博客-点滴-随笔分类-骗子的linux学习</title><link>http://www.cnitblog.com/charester/category/4218.html</link><description>

</description><language>zh-cn</language><lastBuildDate>Wed, 28 Sep 2011 16:32:28 GMT</lastBuildDate><pubDate>Wed, 28 Sep 2011 16:32:28 GMT</pubDate><ttl>60</ttl><item><title>也谈LINUX的学习方向及学习方法. （ZT）</title><link>http://www.cnitblog.com/charester/archive/2006/12/21/20948.html</link><dc:creator>天空</dc:creator><author>天空</author><pubDate>Thu, 21 Dec 2006 13:15:00 GMT</pubDate><guid>http://www.cnitblog.com/charester/archive/2006/12/21/20948.html</guid><wfw:comment>http://www.cnitblog.com/charester/comments/20948.html</wfw:comment><comments>http://www.cnitblog.com/charester/archive/2006/12/21/20948.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cnitblog.com/charester/comments/commentRss/20948.html</wfw:commentRss><trackback:ping>http://www.cnitblog.com/charester/services/trackbacks/20948.html</trackback:ping><description><![CDATA[
		<p>首先,我想说的是,我自己接触LINUX是今年7月份,以前我接触的是一些UNIX系统,如SCO OPENSVER、HP UX、IBM AIX等。本人干的一直都是系统管理方面的工作，学习LINUX一半是由于自己的兴趣，一半是工作的需要（为以后打基础）。对LINUX而言，我还处在熟悉阶段。<br />其次，我要说的是，如果你整天就是美化界面、玩安装、汉化等，你并不能说你是一个LINUX的高手，甚至连一个LINUX的熟悉人士都谈不上。君不见老外有几个懂汉化的？但是你能说你的LINUX水平比他们高吗？<br />学习方向：<br />一、内核源码学习。我现在没时间也没精力来干着件事，大学时曾经读过UNIX的一些源码，我觉得即使你不分析它，读一遍对每个人都是有好处的。<br />二、系统管理、SHELL界面、图形外挂等。就系统管理、用户管理、文件管理等来说，LINUX跟UNIX很相象，很多的命令跟UNIX也差不多。在目前，这是我的学习方向。<br />三、应用开发。就目前而言，在易用性、应用系统多样化方面等，LINUX跟它的竞争对手WINDOWS相比还有一定的差距，我本人的工作性质的关系，基本上不作在LINUX上开发应用的尝试。采用的是拿来就用的原则。<br />四、应用集成。根据自己的工作环境，尝试将一些LINUX的应用集成到工作中，与公司中其它的各种系统、应用形成一个整体，进行统一的管理。这也是我的学习重点。<br />学习方法：<br />一、比较法。我喜欢将一些windows、UNIX中的知识、管理工具、思路跟LINUX作一些比较。发掘它们的相同之处和不同之处。如文件系统，LINUX支持哪些文件系统，而常用的UNIX中又有哪些文件系统，不同的文件系统有什么差异。不同的工作环境中应该怎样选用不同的文件系统？应该怎样在可管理性、安全性、性能等方面进行综合评估它们？如果你一点都说不上的话，我想你应该补补课了。<br />二、举一反三法。对任何的命令，我习惯性的就是先弄清楚它到底有那些参数，能做什么用；跟它相关的命令有哪些，又能做些什么？；这些命令它到底涉及到哪些系统文件？只有这样，才能对这个命令称得上说熟悉，说不定很多你自以为很熟悉的命令能干很多你意想不到的工作哦！<br />三、查询法。我不想对一个自己不知道的问题马上去问别人。很多时候MAN一下，用google查询一下，论坛中搜索一下，答案可能就在你的眼前。我发现很多的弟兄没有养成这种习惯，其实通过你自己查询来的知识，你可能领会得更深，因为你需要好好的从头看一下，看看有什么遗漏的，而不是别人简单的一就是一的告诉你。<br />四、交流法。如果对一个问题进行了思考，查询到了一定的知识，还是解决不了，那么最直接的方法就是上网问别人了，不耻下问嘛！将你的困难、理解、观点告诉别人，请别人来帮助你。<br />好啦，说了一堆费话，也该入正题了。<br />一、问问各位斑竹，咱们论坛的方向是什么，立足LINUX使用普及推广；LINUX系统管理；LINUX与其它系统的集成应用管理；LINUX应用开发；LINUX内核技术研究？？？？？怎样从不同的方向来引导弟兄们进行不同层次的学习？<br />二、也问问各位弟兄们。你们学习LINUX的目的是什么？成为一个使用者；LINUX系统管理者；各种系统综合管理者（集成方案提供者）；应用开发人员；LINUX研究者？？？？？<br />我抛砖引玉，请弟兄们能谈谈自己的一些观点及想法。谢谢！<br /><br /><br /><br /><br />wxz8兄抛砖引玉，我这块碎瓦也来说说。<br />美化界面、玩安装、汉化等是推广Linux的基础，我们都希望有更多的朋友加入Linux。一个论坛光推广Linux也不行的，也要在技术上有所成长。所以我想除了推广，咱们还要发展兄弟提到的LINUX系统管理；LINUX与其它系统的集成应用管理；LINUX应用开发；LINUX内核技术研究等等方面，这就是各个专题版块的所要做的。把新手带进了Linux大门，有了一定的基础，就要看各人自己喜好选择感兴趣的方面研究，这时候相应的版块就给这些朋友们提供了一个好地方。LinuxSir应该是个Linux技术的综合论坛。从入门到高手都会找到适合自己的版块，我是这么期望的。<br />关于大家学习Linux的目的，以前也讨论过，什么都有，很多人都是兴趣，就跟一个爱好一样。并不是都想着将来靠Linux吃饭，这点兄弟你有点现实了，Linux本来就是靠黑客等凭兴趣和自由的信念发展起来的。<br />wxz8兄分析得很好，尤其是学习法，值得大家学习，谢谢。<br /><br /><br />我的观点，入门级和高级应用都要做而且要做好（两手抓两手都要硬 <img class="inlineimg" title="使眼色" alt="" src="http://www.linuxsir.org/bbs/images/smilies/wink.gif" border="0" /> ）<br />虽然现在论坛中大部分的讨论都是很初级的，但想让让更多的人加入linux队伍<br />这些讨论显然还是远远不够的。我们和那些英语国家的人相比，在用linux时又多了语言障碍。汉化过程中会有许多问题，往往一个问题解决了，另一个问题又有了。需要中文输入法。还有就是看“帮助”，人家man一下就解决了很多问题，而我们呢，看不懂，还是得问。（虽然现在有中文的man但还是资料有限，所以一定要把英语学好）。推广linux的基础就是使linux外表更像windows，所以，安装、汉化的讨论是不可避免的，也是很重要的。<br /><br />企业级应用、高级应用也要做好，因为linux在这些方面是强项。而且只有学习这方面知识才能真正提高自己的水平。做好了才能吸引更多的高手到这个论坛。<br /><br />关于资金问题，我觉得可以卖linux的相关东西，国外许多非营利组织也是这么做的（也有许多兄弟没用刻录机没有上宽带，卖光盘也是方便了这些兄弟）<br />还可以找一个信誉比较好的网上广告站点，在页面放些banner 兄弟们会帮着点的。<img class="inlineimg" title="酷" alt="" src="http://www.linuxsir.org/bbs/images/smilies/cool.gif" border="0" /><br /><br /><br /><br />1.读核心源代码是绝对收益大的，而且需要极大的耐心。<br />2.如果能加入一些感兴趣的源码开发项目，收获自然不会少。<br />3.如果能在LINUX下试着开发一个小的项目(哪怕是一个小的工资程序)，则一定能收到意想不到的效果。<br />4.做网管不论做到什么境界，最后还得会编程序，一些东西不是随时有补丁可用的。如想弄懂shellcode，自然还得会看懂代码，不然认识不会深刻。<br />5.要在浓厚兴趣下，努力试着自己解决，自己查找，最后不行再到新闻组或BBS上问。呵呵，自己解决问题后的快感应该象打桥牌后，打了个打大满贯一样爽就可以了。<br /><br />观点可能不好，愿者上勾吧。:-)<br /><br /><br />我很早就想学学关于UNIX/LINUX方面的东西，去年的时候机子上就有了MANDRAKE 8.2了，可是当时一直没怎么用。<br />大概2，3个月前，带着对windows的一些厌倦，重新开始用linux了，开始有很多问题，很多东西都不懂。现在一般的安装、操作都没有什么问题。一是自己学到一些东西，另一方面，现在的发行版安装其实都比较简单了，各种语言一般都支持，只是可能离我们的期望还差那么一点点了。但是要能用总的来说不是太难的事情，但是要用好就是另外一回事。<br />我是做windows下的程序开发的，对windows的整个系统结构，特别是桌面程序还是比较了解，虽然不能进入windows的系统内核，不过写过这么多程序之后，我想对这方面的了解还是比这回用的人更深入一些。明白了他最基本的道理，你就可以驾驭他，让自己随心所欲做一些事情。linux也是一样的，你想驾驭他，那么你必须先了解他的习性，看一些系统较底层一些的东西是很有用处的，毕竟一个操作系统都不是在一定的范围内不断发展，很多基本的东西是不大会有大的改动。就像是unix上的东西大多数在linux上可以用的。了解他们之间的关系对你深入了解这个系统很有帮助的。现在在看两本书，一本是&lt;UNIX操作系统教程&gt;,一本是《unix环境高级编程》，很有启发。<br />我是从一个程序员的角度出发说这些的，如果你想在这个系统上作一些个性话的事情，那么你不了解他怎么性呢。至于“面子”上的事情，过得去就行了！不用太在意。<br /><br /><br />linux太难用了!(一通鼠标点击，进入/etc)<br />学习linux,你忘记windows的思维方式了吗？<br />怎么安装软件阿？那一堆文件是干什么的阿？<br />学习linux,你还在浮躁吗？<br />进入linux,随便按了几下.赶紧重启进入win<br />学习linux,你用心了吗？<br />.......<br />你我共勉之<br /><br />作者:GuCuiwen email:win2linux@163.com<br /><br /><font color="red">版权声明:<br />本文档可以在网络上在非商业范围内自由转载,转载请注明出处<br />如果转载版面包含商业广告,请向作者支付至少每千字100园的稿费<br />以书面,书籍形式转载和出版请按至少每千字100园人民币的标准向作者支付稿费</font><br /><br /><br />首先,我想引用一下别人说过的一句话:除非在过去的十年你一直生活在山洞里,否则你一定听说过linux.<br /><br />是的,现在听说过linux,会一点linux基本操作的人多如牛毛,然而真正能用linux做一点事情的确少之又少,这就造成了现在的状况:各大 linux论坛十分热闹,但我国linux人材却还十分紧缺.到底是什么原因造成了这样的状况? 纠其原因,只有两个字:浮燥!<br /><br />如果在论坛里来一次调查投票,看一下在论坛里的人到底有多少人手头有一本以上的正规linux教材.我想这个数字不会超过30%. 如果再问一下,有多少人完整的读过各发行版自带的入门文档,系统定制文档,系统管理文档和系统安全文档,恐怕这个数字不到10%. 如果进一步再调查一下究竟有多少人静下心来学习过操作系统和计算机网络等和linux学习十分密切的专业课程,那么恐怕只有3%的数字都不到了.<br /><br />这让我想到了98年前后IT泡沫时代的中关村.在中关村的大街小巷,到处是一个个意气分发牛哄哄的IT精英.他们戴着默镜,剔着小平头,张口闭口都是网络,安全,信息,黑客,代码,产业.T恤背后写着三个字:别惹我! 然而最后IT泡沫一过,只有那些真正肯安安心心静心学习的人在IT界存活了下来.<br /><br />现在国人学习linux的状况也是这样,学linux的人个个都意气分发,以为学习linux会用linux是多么了不起.学了一点皮毛就认为很牛了.但是那些企业用人单位却很难找到真正适合的linux人材.因此,我想就目前的状况发表一下我的看法.<br /><br />首先,这篇文章是写给那些想成为linux高手,并真正想用linux做些事情的人.如果你只想做一个菜鸟,没事的时候在你双系统启动的电脑上偶尔选一次linux,然后没事进去偷着乐,那就请你自便.另外,我想说明,和真正的牛人比起来,我自己还处于一个比较低的水平.我没有读过内核源代码,不知道linux工作原理等等,但是通过摸索,至少我已经找到了通往高手的道路的方向.因此还是想说两句.<br /><br />1,linux不是玩具<br /><br />如果你想系统的学习linux,你必需清楚的认识到这一点.现在有很多人,号称是linux爱好者,但是他们大部分的事情还是用windows 做,而linux只是作为一个随便玩玩的系统.他们懂得一些linux的基本操作,知道有linux这个玩艺,也因为经常听人家说linux好就咬定了 linux就是好.只要有人说linux比windows差,那么他们就奋起反驳,他们也看不起用windows的人,认为用windows的人水平低. 但是自己用电脑的大部分时间还是用windows并且把重要的文件都放在了windows分区,因为他们骨子里只把linux当做玩具,没有真正领悟 linux的精髓所在.如果你真正想系统的学习linux,想用linux有所作为,那么请忘记windows的思维方式,慢慢感受和习惯linux的操作方式,总有一天你会真正体验到他的奥妙所在,从而从自己内心深处喜欢他,使用他,而不是为了赶时髦或向人炫耀而使用他.<br /><br />2,手头有一本好的入门教材吗<br /><br />"如果你还没有好好的读完过一本linux安装及入门教材就不要到初学者论坛来问题!因为你连问问题的资格都没有! " 这是我的一个比较偏激的观点.<br /><br />如果你现在开始下决心学习linux了,那么第一件你要做的事情是到书店去挑一本好书.而不是到论坛社区去问该用什么版本,该如何学习 linux.一本好的入门教材可以让你快速领悟linux的操作方式,系统的基本使用等等.而且都是前人总结经验写出来的,他可以帮你搭起一个学习 linux的框架,对linux有一个总体的认识.就好比建一撞大楼前先打好地基,搭好混凝土框架.以后就可以慢慢往这个框架里添砖加瓦,最后建起大楼. 而那些想急于学习的,不想看书,只想靠混论坛来学习linux知识的人,就好比建一撞大楼,今天建好第一层,然后第一层就要全部粉刷好,装修好,家具买好住进去,然后第二天再开始建第二层.这样没有整体规划的学习是学不好linux的,最后的结果是浪费自己的时间,也浪费别人的时间. 如果你不信,可以让实事去告诉你,以一年为限,你和你的一个朋友同时从0开始学linux,计算机基础差不多.你去买几本好书自己慢慢看边看边做实验,让你的朋友整天到各大论坛瞎混零散的学些linux知识.也许一开始,你的朋友会比你懂得多,但是一年以后你的水平肯定在你的朋友之上. 在初学阶段,不要随便在论坛上发问,多看书是根本,即使真的非问不可的问题,也要先自己动手察资料解决.实在不行再来问,高手不会鄙视菜鸟,因为每一个高手都是从菜鸟过来的,他们都知道菜鸟的苦衷.但是高手会看不起那些自己不愿动手动脑不会学习解决问题而只想得到现成答案的人.那样的人会被高手在心里暗骂成不配用linux的蠢货.<br /><br />你需要以下几种书:<br />一本好入门教材-&gt;一本linux指令参考手册-&gt;linux系统管理手册-&gt;讲解linux系统原理的书.<br /><br />一开始,你只需要入门教材就可以了.并且严格安教材的讲解去学习,不要一天到晚想着去装显卡驱动啦,装游戏啦,装软件啦,这些都没有必要.你就当你自己的电脑不能上网,只能通过看书学习.慢慢看书,稳抓稳打.慢慢地就融会贯通了.这时候你再到linux初学者论坛去看看,你在那里早已经是高手了.<br /><br />另外,一开始你要选定一本入门教材,但是不能只看一本,因为有些书上讲的,可能是另外的书上没有的.因此,重点选一本教材看完.然后再看两三本入门教材浏览一下.作为对第一本书的知识的扩充和巩固. 在看书过程中,如果你有什么不懂的,不要急于上论坛问,自己认真看几次,实在不懂没有关系,把问题放在那里.不要钻牛角尖不懂不肯放手,这种精神是好的, 但是方法是错误的.你尽管学下去,也许你看完书本以后的内容,就对前面不懂的内容豁然开朗了.这是在学习linux中常有的情况.<br /><br />另外,现在很多入门书籍是针对非技术型用户的.(我把那些对linux本身不感兴趣,只想用他来上网,听音乐和打字的人称为非技术型用户,而把对linux本身感兴趣的人称为技术用户)<br />这些针对非技术型用户的入门书籍几乎通篇都是插图,讲解的内容都是如何在图形界面下操作.这些书籍并不能帮你成为一个高手.反而会让你养成倚赖鼠标和图形界面操作的习惯以后很难改掉.因此不能看这些书,一定要买那些一开始就从系统基本机构基本命令开始讲解的书籍.我看过的第一本linux入门书籍共有十多章,但是他从第十一章开始才大致的讲解了一下图形界面的知识.我很感谢这本书,让我一开始就脱离了windows的思维方式,给我以后的进一步学习带来了很大帮助.<br /><br />完成以上的内容,你就完成了建大楼打地基建混凝土框架的过程了.可以接下来进一步学习了.<br /><br />3,你看完系统自带的文档了吗?<br /><br />当你完成入门的过程后,就可以开始读其他的文档,然后到论坛的精华区看看,向你建起来的大楼框架中添砖头了.当然 ,首先要读的,还是系统自带的文档.<br /><br />绝大多数linux发行版都自带非常详细的文档.比如我一直在用的redhat,他有从系统安装到系统安全,针对不同层次的人的详尽文档.静下心来,把这些文档读完,比看任何论坛的精华区都有用.书籍和文档就好比是你每天都离不开的一日三餐,论坛区的精华文档就好比是点心和水果.你可以不吃点心和水果,但是决不能不吃正餐.<br /><br />当然,不能为看文档而看文档,你一定要边看边安文档中说的做试验验证.这样才印象深刻,否则看过就忘记了等于没有看.<br /><br />另外,如果真心想学习linux就不要吝啬,也不要害怕丢失数据而不敢做实验.我建议你去买一个小的二手硬盘,然后放开手干.不要怕丢失数据而不敢做,如果你没有学会技能,将来做了linux系统管理员或者网络管理员到那时因为不会而丢了数据就是大事情了.<br /><br />4,学习linux不是逛自由市场.<br /><br />经常看到有人问用什么版本的linux好,其实只要你认真学习无论什么版本都挺好的.要知道,开发linux发行版的人都是通读过linux内核代码,对linux原理极其精通的人,而且每一个开发团队都对他的发行版做过测试后放出的.那些国际知名的大品牌更是如此. 因此,讨论什么版本好并无意义,关键是你是不是真心想学.不过,为了避免曲高和寡,最好选用的人多的版本,比如redhat manrake suse 等等. 国内有一两个linux版本做的也不错,但是国内的linux都是面向非技术型用户开发的,因此,如果你想成为高手,建议不要用国内的版本.<br />学习linux不是逛自由市场,选定版本就要静下心来学习.不要今天换版本明天要升级.这样对你没有好处.我见过一些人号称用过十几种甚至几十种linux,向人谈论起来头头是到,好像懂的很多,但是如果你让他去用linux搭建一个web服务器,做一个linux网关,他就什么都不会了.他们把时间都浪费在了版本的转换上了.<br /><br />5,你能看懂英文文档吗?<br /><br />谈论这个问题,我有点低气不足,因为我自己的英语很差.但是,至少我可以无障碍的读完一般的计算机文档.计算机英语很简单,只要熟悉了计算机专业英语,高中毕业的水平就可以轻松的阅读计算机文档了.如果你的英语实在太差了,连最简单的计算机英语文档都看不懂,那么在学习linux的同时,请赶紧学习英语.也许你说,你可以看翻译的文档,当我还是一个菜菜鸟的时候,也是这样认为的.但是,后来才发现,如果你想深入学习linux,看不懂因为文档实在是太难了.写的最好的,最全面的文档都是英语写的,最先发布的技术信息也都是用英语写的.即便是非英语国家的人发布技术文档,也都首先翻译成英语在国际学术杂志和网络上发表.你去看看各大软硬件生产商的官方网站,有哪一个不是用英语作为其主站的? 长期用windows的人会很不习惯这一点,装个软件还要看半天文档,应为windows用起来实在太简单了.但是如果你想学习linux就必需学会看各种文档,而大部分的文档都是用英语写的.我发现很多人甚至连man文档都不会看,有什么命令不会用了就跑到论坛上来问,还装出一副可怜相,乞讨一个命令的用法.有这些时间还不如自己看看man文档,即使你一个一个单词的翻译成中文再自己看都比问别人强,因为别人的回答再怎么详尽都比不上man文档详尽.安装一个新的软件时先看README,再看INSTALL然后看FAQ,最后才动手安装,这样遇到问题就知道为什么.否则,说明文档都不看,结果出了问题再来找答案反而浪费时间! 古人说欲速则不达就是这个道理!<br /><br />6,忘记windows的思维方式<br /><br />思想性的转变比暂时性的技术提高更有用,因为他能帮助你加快学习速度.现在很多人用linux.但是,他们用linux的方式完全是 windows的那一套方式.骨子里都是windows的思想.这样是不能领悟linux的精髓体验不到他的优越性的.我前几天看到一个朋友要把刚装了不到2天的mandrake 10 删除掉,我问他为什么,他说太慢了,受不了,还是用windows快.然后我留意了一下他用linux的方式,他的所有操作都带着windows的影子. 他连最基本的删除,移动文件这样的操作都要用鼠标,这样当然慢了!最后我只好说,你删除吧,你不适合用linux,linux不是这样用的.各位可以去看看那些linux高级用户,他们是怎样操作的.通常他们都是在X上开一个xterm或者rxvt终端,80%以上的操作都在这个终端下用命令完成,因为 linux的命令行十分强大,速度也十分快,简单的几个命令的组合就能完成非常复杂的操作.举一个例子:linux的常用命令find,去看看man文档,初学者一定会觉得太复杂而不原意用,但是你一旦学会了就对他爱不释手.他的功能实在太强了,在配合exec参数或者通过管道重定向到xargs命令和 grep命令,那么他能完成非常复杂的操作,如果同样的操作你用图形界面的工具来完成,恐怕要多花十几陪的时间.因此linux高手经常会说:如果没有 find和grep我们还怎么活.但是现在大部分的linux初级用户受到windows影响都喜欢用图形界面的工具来完成一些基本的操作,我并不是说图形界面不好.只是由于linux和windows设计思想的不同他们的操作方式也有很大不同.在windows下用图形界面操作会比敲命令快,但是 linux是一个命令行组成的操作系统,他的精髓在命令行! 无论图形界面发展到什么水平这个原理是不会变的!<br /><br />7,入门以后多学命令<br /><br />当你看完了一两本入门书籍后就应该扩充自己的知识,多学习linux命令,但是不要在初学阶段就系统的学习linux命令,初学阶段只要学会书上提到过的命令就可以了.单靠学习各种命令而成为高手是不可能的,但不会命令而成为高手也是不可能的.这就好比学英语,什么语法都不懂,只捧着单词手册背单词是学不会英语的,但是没有单词词汇量英语水平也提不高的.<br /><br />在linux中学习命令的最好办法是学习bash脚本编程.bash脚本比起其他语言来学习简单,但是功能却十分强大.通过学习bash编程,能让你掌握大量的linux命令.另外,买一本命令参考手册是必要的,遇到不知道怎么用的命令可以随时查询,这要比察man文档快.特别适合英语不好,看不懂man文档的人.<br /><br />在linux中,命令可分为系统基本命令和应用程序命令.系统基本命令是所有的unix类系统都支持的命令,走到哪都不变,只要是unix类系统上就肯定有.比如ls,rm,rmdir,cp,cd,mv,cat等等.这样的基本命令大约有200个,这些命令是一定要掌握的,我买了一本&lt; redhat 7 指令参考手册&gt;这本书非常好,他根据命令的常用指数分类,标明3颗星的为最常用命令,一定要掌握,两颗星的其次,1颗星的只要知道一下就可以了虽然现在都已经FC3了,但是经典的UNIX基本命令几十年来都没有变过!另外有些命令是linux特有的或者是某一个应用程序的可执行文件比如xmms播放器.这些只要知道就可以了,不知道也无所谓.有些命令比较少用,因此通常都记不住他的用法,对于这些命令至少要知道有这个命令,脑子里有印象,需要用的时候察一下手册就可以了,但是决不能不知道这个命令的存在!<br /><br />8,学会管理系统<br /><br />等到有了基本知识,也掌握了一定量的命令用法后,就可以进一步学习管理系统.这些内容入门书上会有,但是不会很深入.要深入的学习系统管理,就要去买一本类似&lt;linux系统管理大全&gt;之类的书.认真的看书并做实验,可以让你很快的进步.学习配置各种网络服务器,用linux搭建网络,这些都是学习linux系统管理和网络管理的好方法. 到了这个阶段就可以经常上网察察资料,看发布软件的官方网站文档和FAQ,看看论坛精华区文章.但是不能本末倒置,多看书还是根本.书籍和官方文档可以让你系统的学习,但是论坛可以让你学到一些小知识,小技巧.我本人也经常到论坛上来看看,因为即便是一个新手,也可能会发现一些你所不知道的小技巧,看论坛可以学到这些小技巧.但是我看文档和看论坛的时间比不会小于4:1 . 可以把平时积累的问题一次在论坛上发问. 但是初学的时候不要频繁上论坛,因为你要问的问题都在书上写着,耐心一点,你很快就能看到了.<br /><br />9,了结系统结构<br /><br />等你有了一定的系统管理知识,知道了/etc下那些配置文件有什么用,知道了一般的网络服务器如何配置后,就可以去了解系统结构了. 了解系统结构不是要你去看什么文件夹放什么内容,而是要学习一些原理性的东西.比如系统是如何引导的,引导后启动了那些东西.系统中哪些是最基本的库文件,有什么用等等.学习系统结构的最好方法是自己做一个linux系统,再也没有什么能比自己做一个linux系统更能学习系统结构的了.LFS (linux from strach)可以教你从源代码自己编译一个系统.通过自己编译一个系统,你就可以了结linux系统结构,知道哪些文件是干什么用的,以及他们如何协调工作.当然,在你达到LFS水平之前还有很多事情要做,比如学会如何编译安装源代码发布的软件和编译新的内核等等.到了LFS水平,那么在大多数 linux论坛上你就可以被人称作"高手"了!到了这个地步,就相当于一撞大楼已经基本建好,但是还需要粉刷和装修,真正的细活还在后面!<br /><br />永远记住天外有天,人外有人的道理.即便有了LFS水平,在那些搞linux系统开发,通读过linux内核代码的人看来你还是一个菜鸟.因此, 请时刻保持虚心的态度.即便是在 论坛上只有一颗星级别的人,也有可能是一个潜在的,真正的高手! 大多数真正的高手平时都在搞研发工作,哪里有时间上论坛啊! 倒是有很多大学还没毕业的学生,整天混在论坛上.<br /><br />10,学习专业课程<br /><br />如果你不是计算机专业的,而想把linux学好,就一定要学习专业课程.学习微机原理,操作系统,计算机网络等等专业课程是必需的.为什么同时开始学习linux,有些人学的非常快,不到半年就成了高手,有些人玩来玩去还玩不出名堂,玩了一两年还是菜鸟? 因为那些学得快的人有基础,他们都学过专业课程.同样一篇文档,没有基础的人可能看了三遍还不明白,基础扎实的眼睛扫两下就懂了! 这就是专业和非专业的差别! 因此,要想达到更高的境界就一定要学习基础的专业课程.<br /><br />11,保持虚心学习的态度<br /><br />我想再重复一遍天外有天,人外有人的道理!<br />保持虚心的学习态度不仅能让你学到更多知识,而且会让你受人尊重.<br /><br />在linux的世界里,如果你想靠混论坛,发水贴,换几颗星星增加一下级别,然后再面对菜鸟说几句牛哄哄的话来赢得别人的尊重是不可能的.即便是一个刚入门的菜鸟,也能分辨你回答问题的质量,从而知道你到底有多少水平. 另外,当你成了"高手"的时候,你也能从"菜鸟"那里学到很多知识.因为有很多问题是你从来没有想过的,认为自己肯定会的,但是实际遇到的时候会有困难. 而"菜鸟"们往往更善于发现这类问题.这就是中国人常说的"教学相长"!<br /><br />在linux的世界里,越是水平高的人越谦虚,因为他们知道自己还有很多不知道的,而那些半瓶水就想晃荡的人反而自以为是,因为他们还不知道自己还有很多不知道的! 去看看,<a href="http://www.linuxforum.net/" target="_blank"><font color="#000000">www.linuxforum.net</font></a> 嵌入式开发和UNIX版块的牛人,他们很多都是有过好几年linux方面的工作经验,精通linux和unix的好手,但是每个人都保持着非常谦逊的态度,这些人是值得尊敬的<br /><br /><br /><br /><!-- vB 中文修改开始: 显示声望 --><!-- vB 中文修改结束 --></p>
<img src ="http://www.cnitblog.com/charester/aggbug/20948.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cnitblog.com/charester/" target="_blank">天空</a> 2006-12-21 21:15 <a href="http://www.cnitblog.com/charester/archive/2006/12/21/20948.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>GCC 入门资料（三）（ZT）</title><link>http://www.cnitblog.com/charester/archive/2006/12/21/20946.html</link><dc:creator>天空</dc:creator><author>天空</author><pubDate>Thu, 21 Dec 2006 13:06:00 GMT</pubDate><guid>http://www.cnitblog.com/charester/archive/2006/12/21/20946.html</guid><wfw:comment>http://www.cnitblog.com/charester/comments/20946.html</wfw:comment><comments>http://www.cnitblog.com/charester/archive/2006/12/21/20946.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cnitblog.com/charester/comments/commentRss/20946.html</wfw:commentRss><trackback:ping>http://www.cnitblog.com/charester/services/trackbacks/20946.html</trackback:ping><description><![CDATA[动态库*.so在linux下用c和c++编程时经常会碰到，最近在网站找了几篇文章介绍动态库的编译和链接，总算搞懂了这个之前一直不太了解得东东，这里做个笔记，也为其它正为动态库链接库而苦恼的兄弟们提供一点帮助。<br />1、动态库的编译<br /><br />下面通过一个例子来介绍如何生成一个动态库。这里有一个头文件：so_test.h，三个.c文件：test_a.c、test_b.c、test_c.c，我们将这几个文件编译成一个动态库：libtest.so。<br /><br />so_test.h：<br /><br /><br /><br />#include <br /><br />#include <br /><br /><br /><br />void test_a();<br /><br />void test_b();<br /><br />void test_c();<br /><br /><br /><br />test_a.c：<br /><br /><br /><br />#include "so_test.h"<br /><br /><br /><br />void test_a()<br /><br />{<br /><br />printf("this is in test_a...\n");<br /><br />}<br /><br /><br /><br />test_b.c：<br /><br /><br /><br />#include "so_test.h"<br /><br /><br /><br />void test_b()<br /><br />{<br /><br />printf("this is in test_b...\n");<br /><br />}<br /><br /><br /><br />test_a.c：<br /><br /><br /><br />#include "so_test.h"<br /><br /><br /><br />void test_c()<br /><br />{<br /><br />printf("this is in test_c...\n");<br /><br />}<br /><br /><br /><br />将这几个文件编译成一个动态库：libtest.so<br /><br /><br /><br />$ gcc test_a.c test_b.c test_c.c -fPIC -shared -o libtest.so<br /><br /><br />2、动态库的链接<br /><br />在1、中，我们已经成功生成了一个自己的动态链接库libtest.so，下面我们通过一个程序来调用这个库里的函数。程序的源文件为：test.c。<br /><br />test.c：<br /><br /><br /><br />#include "so_test.h"<br /><br /><br /><br />int main()<br /><br />{<br /><br />test_a();<br /><br />test_b();<br /><br />test_c();<br /><br /><br /><br />return 0;<br /><br />}<br /><br /><br /><br />l 将test.c与动态库libtest.so链接生成执行文件test：<br /><br /><br /><br />$ gcc test.c -L. -ltest -o test<br /><br /><br /><br />l 测试是否动态连接，如果列出libtest.so，那么应该是连接正常了<br /><br /><br /><br />$ ldd test<br /><br /><br /><br />l 执行test，可以看到它是如何调用动态库中的函数的。<br />3、编译参数解析<br />最主要的是GCC命令行的一个选项:<br />-shared 该选项指定生成动态连接库（让连接器生成T类型的导出符号表，有时候也生成弱连接W类型的导出符号），不用该标志外部程序无法连接。相当于一个可执行文件<br /><br />l -fPIC：表示编译为位置独立的代码，不用此选项的话编译后的代码是位置相关的所以动态载入时是通过代码拷贝的方式来满足不同进程的需要，而不能达到真正代码段共享的目的。<br /><br />l -L.：表示要连接的库在当前目录中<br /><br />l -ltest：编译器查找动态连接库时有隐含的命名规则，即在给出的名字前面加上lib，后面加上.so来确定库的名称<br /><br />l LD_LIBRARY_PATH：这个环境变量指示动态连接器可以装载动态库的路径。<br /><br />l 当然如果有root权限的话，可以修改/etc/ld.so.conf文件，然后调用 /sbin/ldconfig来达到同样的目的，不过如果没有root权限，那么只能采用输出LD_LIBRARY_PATH的方法了。<br />4、注意<br /><br />调用动态库的时候有几个问题会经常碰到，有时，明明已经将库的头文件所在目录 通过 “-I” include进来了，库所在文件通过 “-L”参数引导，并指定了“-l”的库名，但通过ldd命令察看时，就是死活找不到你指定链接的so文件，这时你要作的就是通过修改LD_LIBRARY_PATH或者/etc/ld.so.conf文件来指定动态库的目录。通常这样做就可以解决库无法链接的问题了。<img src ="http://www.cnitblog.com/charester/aggbug/20946.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cnitblog.com/charester/" target="_blank">天空</a> 2006-12-21 21:06 <a href="http://www.cnitblog.com/charester/archive/2006/12/21/20946.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>GCC 入门资料（四）（ZT） </title><link>http://www.cnitblog.com/charester/archive/2006/12/21/20947.html</link><dc:creator>天空</dc:creator><author>天空</author><pubDate>Thu, 21 Dec 2006 13:06:00 GMT</pubDate><guid>http://www.cnitblog.com/charester/archive/2006/12/21/20947.html</guid><wfw:comment>http://www.cnitblog.com/charester/comments/20947.html</wfw:comment><comments>http://www.cnitblog.com/charester/archive/2006/12/21/20947.html#Feedback</comments><slash:comments>1</slash:comments><wfw:commentRss>http://www.cnitblog.com/charester/comments/commentRss/20947.html</wfw:commentRss><trackback:ping>http://www.cnitblog.com/charester/services/trackbacks/20947.html</trackback:ping><description><![CDATA[Linux编程入门-gcc、make和gdb简介<br /><br />欢迎来到Linux的编程世界！<br />　　如果你已是Windows下优秀的程序员，那么到了这里，你将会发现一个崭新的天地，虽然在Linux下编程比起在Windows下编程有种种的不便，但她的许多迷人之处一定会让你流连忘返-----只要你是一个真正"热爱"编程的程序员；如果你以前很少编程，只是刚刚迈进了这个大门，那么，你更是走对了地方，在这里，你会得到比MSDN更多的指引和帮助，你会迅速的成长为真正的程序员----如果你想成为的话。当然，这里最吸引人的，还应该是自由软件的精神。或许，在以后，你会把这里作为自己的家园。<br />　　要成为Linux下优秀的程序员，首先你要接触的便是gcc、make和gdb。如果你对微软的Visual系列开发工具有所了解的话，那么下面的等式会让你对它们有所了解，虽然并不是那么贴切：<br />　　　　gcc + make + gdb = Visual C ++<br />　　gcc(GNU cc)是一个编译器套件，它不仅能编译C、Objective C和C++程序，还能编译Fortran、Pascal等语言编写的程序。但就编译器而言，它是目前编译最快、效率最高的编译器，当然，这是非官方的说法。<br />　　make是一个项目管理工具。如果你早已习惯了敲F9、Ctrl+F9或者点击某个按钮来编译运行程序，那么，这个工具将会使你明白这一切如何发生的。<br />　　gdb（GNU DeBugger）是一个调试器，这对一个程序员是必不可少的。gdb的功能非常强大，但如果把友好的图形化的界面作为衡量的主要标准之一，那么现阶段在Linux下的确缺少好的调试器。xxgdb和kde下的Debugger正在这方面努力着。<br />　　和绝大多数教材、文章一样，我们从"Hello World!"开始。<br />　　我们先用vi或者其他一些图形化的编辑器生成一个hello.c文件： <br /><br />　　#include <br />　　void main(void)<br />　　{<br />　　　printf("Hello World!");<br />　　}<br /><br />　　我们使用gcc进行编译：<br />　　gcc hello.c -o hello<br />　　就在当前目录下生成可执行文件hello，运行这个文件，你自然就会看到Hello World!的字样。这里hello.c是源文件，-o是编译选项，hello是你指定的文件名。要注意的是，不要使用test、help这类"常用"的名字来命名自己的可执行文件，他们往往早已被系统捷足先登了。<br />　　在程序中如果引用了其它的头文件，则需要用 -I路径名 选项告诉编译器在那里才能找到这些头文件。例如，在hello.c文件中有如下的两行：<br />　　#include <br />　　#include <br />　　其中myheadfile1.h在目录/usr/local/include目录下，myheadfile2.h在上一层目录下，则编译命令如下：<br />　　gcc -I/usr/local/include -I.. hello.c -o hello<br />程序中如果使用了不在默认库中的调用，例如，要在hello.c中调用pthread_create( )函数创建多线程，输入如下代码：<br />　　……<br />　　#include <br />　　……<br />　　pthread_create(t,attr,0,0);<br />　　……<br />　　使用上面的命令编译将出错：undefined reference to 'pthread_create'。这是因为没有告诉编译器在哪里能找到包含了名为pthread_create的调用。pthread_create在/usr/lib目录下的库文件libpthread.a(静态库)和libpthread.so（动态库）中。用 -L路径名 指定库的位置，用 -lFILE 指定库名为libFILE的静态或动态库。包含了pthread_create的hello.c的编译命令为：<br />　　gcc -L/usr/lib -lpthread hello.c -o hello<br />　　当程序为一个项目，包含很多文件时，可以先用 -c 选项编译生成目标文件，然后再用-o选项连接目标文件生成可执行文件。例如，项目的源文件为server.c 和 client.c，想生成名为 myapp 的可执行文件，则编译命令为：<br />　　gcc -c server.c<br />　　gcc -c client.c<br />　　gcc server.o client.o -o myapp<br />　　以上编译命令和下面的编译命令是等价的：<br />　　gcc client.c server.c -o myapp<br />　　当项目包含多个文件时，每一次敲入繁琐的编译命令大概会吓跑所有慕名到Linux下来开发的程序员们。这时，就该make来大显身手了。<br />　　make会在当前目录下寻找名为Makefile或makefile的文件，然后依次执行该文件。以前面的myapp为例：<br />　　myapp: server.o client.o<br />　　gcc server.o client.o -o myapp<br />　　server.o: server.c<br />　　gcc -c server.c<br />　　client.o: client.c<br />　　gcc -c client.c<br />　　其中，为键盘Tab键，不能用几个空格代替，即使它们看起来一样。第1、3、5行定义了依赖关系，第2、4、6行定义了相应的编译命令。make扫描1、3、5行，目标不存在则调用相应的命令行编译，若已经存在，则比较文件日期，若冒号后的文件新于冒号前的，同样重新编译。这样，如果用户仅仅修改了client.c一个文件，则用make重新编译时server.o就不会被重新编译，这样大大节省了时间。<br />　　千里之行，始于足下。这虽然只是一个简单的开始，但是，通向一个神秘殿堂的大门已经打开了，如何才能成为一个合格的程序员，一切都要靠努力，努力养成看文档、看How-to、看高手程序的好习惯，努力自己去动手实践，一切都会好起来的<img src ="http://www.cnitblog.com/charester/aggbug/20947.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cnitblog.com/charester/" target="_blank">天空</a> 2006-12-21 21:06 <a href="http://www.cnitblog.com/charester/archive/2006/12/21/20947.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>GCC 入门资料（一）（ZT）</title><link>http://www.cnitblog.com/charester/archive/2006/12/21/20944.html</link><dc:creator>天空</dc:creator><author>天空</author><pubDate>Thu, 21 Dec 2006 13:04:00 GMT</pubDate><guid>http://www.cnitblog.com/charester/archive/2006/12/21/20944.html</guid><wfw:comment>http://www.cnitblog.com/charester/comments/20944.html</wfw:comment><comments>http://www.cnitblog.com/charester/archive/2006/12/21/20944.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cnitblog.com/charester/comments/commentRss/20944.html</wfw:commentRss><trackback:ping>http://www.cnitblog.com/charester/services/trackbacks/20944.html</trackback:ping><description><![CDATA[学习GCC的时候,在网上搜集的部分入门的资料.希望对您有所帮助!<br /><br />一、GCC简介<br /><br />通常所说的GCC是GUN Compiler Collection的简称，除了编译程序之外，它还含其他相关工具，所以它能把易于人类使用的高级语言编写的源代码构建成计算机能够直接执行的二进制代码。GCC是Linux平台下最常用的编译程序，它是Linux平台编译器的事实标准。同时，在Linux平台下的嵌入式开发领域，GCC也是用得最普遍的一种编译器。GCC之所以被广泛采用，是因为它能支持各种不同的目标体系结构。例如，它既支持基于宿主的开发（简单讲就是要为某平台编译程序，就在该平台上编译），也支持交叉编译（即在A平台上编译的程序是供平台B使用的）。目前，GCC支持的体系结构有四十余种，常见的有X86系列、Arm、PowerPC等。同时，GCC还能运行在不同的操作系统上，如Linux、Solaris、Windows等。<br /><br /><br />除了上面讲的之外，GCC除了支持C语言外，还支持多种其他语言，例如C++、Ada、Java、Objective-C、FORTRAN、Pascal等。<br /><br /><br />本系列文章中，我们不仅介绍GCC的基本功能，还涉及到一些诸如优化之类的高级功能。另外，我们还考察GCC的一些映像操作工具，如size和objcopy等，这将在后续的文章中加以介绍。<br /><br /><br />二、程序的编译过程<br /><br /><br />对于GUN编译器来说，程序的编译要经历预处理、编译、汇编、连接四个阶段，如下图所示：<br /><br /><br /><br /><br /><br />从功能上分，预处理、编译、汇编是三个不同的阶段，但GCC的实际操作上，它可以把这三个步骤合并为一个步骤来执行。下面我们以C语言为例来谈一下不同阶段的输入和输出情况。<br /><br /><br />在预处理阶段，输入的是C语言的源文件，通常为*.c。它们通常带有.h之类头文件的包含文件。这个阶段主要处理源文件中的#ifdef、 #include和#define命令。该阶段会生成一个中间文件*.i，但实际工作中通常不用专门生成这种文件，因为基本上用不到；若非要生成这种文件不可，可以利用下面的示例命令：<br /><br /><br /><br /><br />gcc -E test.c -o test.i<br /><br /><br /><br /><br />在编译阶段，输入的是中间文件*.i，编译后生成汇编语言文件*.s 。这个阶段对应的GCC命令如下所示：<br /><br /><br /><br /><br />GCC -S test.i -o test.s <br /><br /><br /><br /><br />在汇编阶段，将输入的汇编文件*.s转换成机器语言*.o。这个阶段对应的GCC命令如下所示：<br /><br /><br /><br /><br />GCC -c test.s -o test.o <br /><br /><br /><br /><br />最后，在连接阶段将输入的机器代码文件*.s（与其它的机器代码文件和库文件）汇集成一个可执行的二进制代码文件。这一步骤，可以利用下面的示例命令完成：<br /><br /><br /><br /><br />GCC test.o -o test <br /><br /><br /><br /><br />上面介绍了GCC编译过程的四个阶段以及相应的命令。下面我们进一步介绍常用的GCC的模式。<br /><br /><br />三、GCC常用模式<br /><br /><br />这里介绍GCC追常用的两种模式：编译模式和编译连接模式。下面以一个例子来说明各种模式的使用方法。为简单起见，假设我们全部的源代码都在一个文件test.c中，要想把这个源文件直接编译成可执行程序，可以使用以下命令：<br /><br /><br /><br /><br />$ GCC -o test<br /><br /><br /><br /><br />这里test.c是源文件，生成的可执行代码存放在一个名为test 的文件中（该文件是机器代码并且可执行）。-o 是生成可执行文件的输出选项。如果我们只想让源文件生成目标文件（给文件虽然也是机器代码但不可执行），可以使用标记-c ，详细命令如下所示：<br /><br /><br /><br /><br />$ GCC -c test.c<br /><br /><br /><br /><br />默认情况下，生成的目标文件被命名为test.o，但我们也可以为输出文件指定名称，如下所示：<br /><br /><br /><br /><br />$ GCC -c test.c -o <br /><br /><br /><br /><br />上面这条命令将编译后的目标文件命名为mytest.o，而不是默认的test.o。<br /><br /><br />迄今为止，我们谈论的程序仅涉及到一个源文件；现实中，一个程序的源代码通常包含在多个源文件之中，这该怎么办？没关系，即使这样，用GCC处理起来也并不复杂，见下例：<br /><br /><br /><br /><br />$ GCC -o test first.c second.c third.c<br /><br /><br /><br /><br />需要注意的是，要生成可执行程序时，一个程序无论有有一个源文件还是多个源文件，所有被编译和连接的源文件中必须有且仅有一个main函数，因为main函数是该程序的入口点（换句话说，当系统调用该程序时，首先将控制权授予程序的main函数）。但如果仅仅是把源文件编译成目标文件的时候，因为不会进行连接，所以main函数不是必需的。<br /><br /><br />四、常用选项<br /><br /><br />许多情况下，头文件和源文件会单独存放在不同的目录中。例如，假设存放源文件的子目录名为./src，而包含文件则放在层次的其他目录下，如./inc。当我们在./src 目录下进行编译工作时，如何告诉GCC到哪里找头文件呢？方法如下所示：<br /><br /><br /><br /><br />$ gcc test.c �I../inc -o test<br /><br /><br /><br /><br />上面的命令告诉GCC包含文件存放在./inc 目录下，在当前目录的上一级。如果在编译时需要的包含文件存放在多个目录下，可以使用多个-I 来指定各个目录：<br /><br /><br /><br /><br />$ gcc test.c �I../inc �I../../inc2 -o test<br /><br /><br /><br /><br />这里指出了另一个包含子目录inc2，较之前目录它还要在再上两级才能找到。<br /><br /><br />另外，我们还可以在编译命令行中定义符号常量。为此，我们可以简单的在命令行中使用-D选项即可，如下例所示：<br /><br /><br /><br /><br />$ gcc -DTEST_CONFIGURATION test.c -o test<br /><br /><br /><br /><br />上面的命令与在源文件中加入下列命令是等效的：<br /><br /><br /><br /><br />#define TEST_CONFIGURATION<br /><br /><br /><br /><br />在编译命令行中定义符号常量的好处是，不必修改源文件就能改变由符号常量控制的行为。<br /><br /><br />五、警告功能<br /><br /><br />当GCC在编译过程中检查出错误的话，它就会中止编译；但检测到警告时却能继续编译生成可执行程序，因为警告只是针对程序结构的诊断信息，它不能说明程序一定有错误，而是存在风险，或者可能存在错误。虽然GCC提供了非常丰富的警告，但前提是你已经启用了它们，否则它不会报告这些检测到的警告。<br /><br /><br />在众多的警告选项之中，最常用的就是-Wall选项。该选项能发现程序中一系列的常见错误警告，该选项用法举例如下：<br /><br /><br /><br /><br />$ gcc -Wall test.c -o test<br /><br /><br /><br /><br />该选项相当于同时使用了下列所有的选项：<br /><br /><br />◆unused-function：遇到仅声明过但尚未定义的静态函数时发出警告。<br /><br />◆unused-label：遇到声明过但不使用的标号的警告。<br /><br />◆unused-parameter：从未用过的函数参数的警告。<br /><br />◆unused-variable：在本地声明但从未用过的变量的警告。<br /><br />◆unused-value：仅计算但从未用过的值得警告。<br /><br />◆Format：检查对printf和scanf等函数的调用，确认各个参数类型和格式串中的一致。<br /><br />◆implicit-int：警告没有规定类型的声明。<br /><br />◆implicit-function-：在函数在未经声明就使用时给予警告。<br /><br />◆char-subscripts：警告把char类型作为数组下标。这是常见错误，程序员经常忘记在某些机器上char有符号。<br /><br />◆missing-braces：聚合初始化两边缺少大括号。<br /><br />◆Parentheses：在某些情况下如果忽略了括号，编译器就发出警告。<br /><br />◆return-type：如果函数定义了返回类型，而默认类型是int型，编译器就发出警告。同时警告那些不带返回值的 return语句，如果他们所属的函数并非void类型。<br /><br />◆sequence-point：出现可疑的代码元素时，发出报警。<br /><br />◆Switch：如果某条switch语句的参数属于枚举类型，但是没有对应的case语句使用枚举元素，编译器就发出警告（在switch语句中使用default分支能够防止这个警告）。超出枚举范围的case语句同样会导致这个警告。<br /><br />◆strict-aliasing：对变量别名进行最严格的检查。<br /><br />◆unknown-pragmas：使用了不允许的#pragma。<br /><br />◆Uninitialized：在初始化之前就使用自动变量。<br /><br /><br />需要注意的是，各警告选项既然能使之生效，当然也能使之关闭。比如假设我们想要使用-Wall来启用个选项，同时又要关闭unused警告，利益通过下面的命令来达到目的：<br /><br /><br /><br /><br />$ gcc -Wall -Wno-unused test.c -o test<br /><br /><br /><br /><br />下面是使用-Wall选项的时候没有生效的一些警告项：<br /><br /><br />◆cast-align：一旦某个指针类型强制转换时，会导致目标所需的地址对齐边界扩展，编译器就发出警告。例如，某些机器上只能在2或4字节边界上访问整数，如果在这种机型上把char *强制转换成int *类型， 编译器就发出警告。<br /><br />◆sign-compare：将有符号类型和无符号类型数据进行比较时发出警告。<br /><br />◆missing-prototypes ：如果没有预先声明函数原形就定义了全局函数，编译器就发出警告。即使函数定义自身提供了函数原形也会产生这个警告。这样做的目的是检查没有在头文件中声明的全局函数。<br /><br />◆Packed：当结构体带有packed属性但实际并没有出现紧缩式给出警告。<br /><br />◆Padded：如果结构体通过充填进行对齐则给出警告。<br /><br />◆unreachable-code：如果发现从未执行的代码时给出警告。<br /><br />◆Inline：如果某函数不能内嵌（inline），无论是声明为inline或者是指定了-finline-functions 选项，编译器都将发出警告。 <br /><br />◆disabled-optimization：当需要太长时间或过多资源而导致不能完成某项优化时给出警告。<br /><br /><br />上面是使用-Wall选项时没有生效，但又比较常用的一些警告选项。本文中要介绍的最后一个常用警告选项是-Werror。使用该选项后，GCC发现可疑之处时不会简单的发出警告就算完事，而是将警告作为一个错误而中断编译过程。该选项在希望得到高质量代码时非常有用。 <br /><br /><br />六、小结<br /><br /><br />本文介绍了GCC的基本编译过程和编译模式，并详细阐述了GCC的一些常用选项以及警告功能。这些是在利用GCC进行应用编程时最基本也最常用的一些内容，我们会在后续文章中继续介绍GCC的调试和优化技术。<img src ="http://www.cnitblog.com/charester/aggbug/20944.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cnitblog.com/charester/" target="_blank">天空</a> 2006-12-21 21:04 <a href="http://www.cnitblog.com/charester/archive/2006/12/21/20944.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>GCC 入门资料（二）（ZT）</title><link>http://www.cnitblog.com/charester/archive/2006/12/21/20945.html</link><dc:creator>天空</dc:creator><author>天空</author><pubDate>Thu, 21 Dec 2006 13:04:00 GMT</pubDate><guid>http://www.cnitblog.com/charester/archive/2006/12/21/20945.html</guid><wfw:comment>http://www.cnitblog.com/charester/comments/20945.html</wfw:comment><comments>http://www.cnitblog.com/charester/archive/2006/12/21/20945.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cnitblog.com/charester/comments/commentRss/20945.html</wfw:commentRss><trackback:ping>http://www.cnitblog.com/charester/services/trackbacks/20945.html</trackback:ping><description><![CDATA[GCC 是 GNU 的 C 和 C++ 编译器。实际上，GCC 能够编译三种语言：C、C++ 和 O <br />bject C（C 语言的一种面向对象扩展）。利用 gcc 命令可同时编译并连接 C 和 C++ <br />源程序。 <br />　　如果你有两个或少数几个 C 源文件，也可以方便地利用 GCC 编译、连接并生成可 <br />执行文件。例如，假设你有两个源文件 main.c 和 factorial.c 两个源文件，现在要编 <br />译生成一个计算阶乘的程序。 <br />代码: <br />----------------------- <br />清单 factorial.c <br />----------------------- <br />int factorial (int n) <br />{ <br />　　if (n &lt;= 1) <br />　　　return 1; <br />　　else <br />　　　return factorial (n - 1) * n; <br />} <br />----------------------- <br />清单 main.c <br />----------------------- <br />#include　&lt;stdio.h&gt; <br />#include　&lt;unistd.h&gt; <br />int factorial (int n); <br />int main (int argc, char **argv) <br />{ <br />　　int n; <br />　　if (argc &lt; 2) <br />　　{ <br />　　　　printf ("Usage: %s n\n", argv [0]); <br />　　　　return -1; <br />　　} <br />　　else <br />　　{ <br />　　　n = atoi (argv[1]); <br />　　　printf ("Factorial of %d is %d.\n", n, factorial (n)); <br />　　 } <br />　　return 0; <br />} <br />----------------------- <br />利用如下的命令可编译生成可执行文件，并执行程序： <br />$ gcc -o factorial main.c factorial.c <br />$ ./factorial 5 <br />Factorial of 5 is 120. <br />　　GCC 可同时用来编译 C 程序和 C++ 程序。一般来说，C 编译器通过源文件的后缀 <br />名来判断是 C 程序还是 C++ 程序。在 Linux 中，C 源文件的后缀名为 .c，而 C++ 源 <br />文件的后缀名为 .C 或 .cpp。但是，gcc 命令只能编译 C++ 源文件，而不能自动和 C <br />++ 程序使用的库连接。因此，通常使用 g++ 命令来完成 C++ 程序的编译和连接，该程 <br />序会自动调用 gcc 实现编译。假设我们有一个如下的 C++ 源文件（hello.C）： <br />#include &lt;iostream&gt; <br />void main (void) <br />{ <br />　　cout &lt;&lt; "Hello, world!" &lt;&lt; endl; <br />} <br />则可以如下调用 g++ 命令编译、连接并生成可执行文件： <br />$ g++ -o hello hello.C <br />$ ./hello <br />Hello, world! <br />**********************gcc/egcs 的主要选项********* <br />gcc 命令的常用选项 <br />选项 解释 <br />-ansi 只支持 ANSI 标准的 C 语法。这一选项将禁止 GNU C 的某些特色， <br />例如 asm 或 typeof 关键词。 <br />-c 只编译并生成目标文件。 <br />-DMACRO 以字符串“1”定义 MACRO 宏。 <br />-DMACRO=DEFN 以字符串“DEFN”定义 MACRO 宏。 <br />-E 只运行 C 预编译器。 <br />-g 生成调试信息。GNU 调试器可利用该信息。 <br />-IDIRECTORY 指定额外的头文件搜索路径DIRECTORY。 <br />-LDIRECTORY 指定额外的函数库搜索路径DIRECTORY。 <br />-lLIBRARY 连接时搜索指定的函数库LIBRARY。 <br />-m486 针对 486 进行代码优化。 <br />-o FILE 生成指定的输出文件。用在生成可执行文件时。 <br />-O0 不进行优化处理。 <br />-O 或 -O1 优化生成代码。 <br />-O2 进一步优化。 <br />-O3 比 -O2 更进一步优化，包括 inline 函数。 <br />-shared 生成共享目标文件。通常用在建立共享库时。 <br />-static 禁止使用共享连接。 <br />-UMACRO 取消对 MACRO 宏的定义。 <br />-w 不生成任何警告信息。 <br />-Wall 生成所有警告信息。<img src ="http://www.cnitblog.com/charester/aggbug/20945.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cnitblog.com/charester/" target="_blank">天空</a> 2006-12-21 21:04 <a href="http://www.cnitblog.com/charester/archive/2006/12/21/20945.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>VI 学习（四）vi的使用总结（图形）（ZT）</title><link>http://www.cnitblog.com/charester/archive/2006/12/21/20943.html</link><dc:creator>天空</dc:creator><author>天空</author><pubDate>Thu, 21 Dec 2006 13:01:00 GMT</pubDate><guid>http://www.cnitblog.com/charester/archive/2006/12/21/20943.html</guid><wfw:comment>http://www.cnitblog.com/charester/comments/20943.html</wfw:comment><comments>http://www.cnitblog.com/charester/archive/2006/12/21/20943.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cnitblog.com/charester/comments/commentRss/20943.html</wfw:commentRss><trackback:ping>http://www.cnitblog.com/charester/services/trackbacks/20943.html</trackback:ping><description><![CDATA[
		<p>
				<strong>
						<img onmouseover="if(this.alt) this.style.cursor='pointer';" style="CURSOR: pointer" onclick="if(this.alt) window.open('http://cache45.51.com/photo5/f4/1c/linuwa/f200ce85ff603dc59cdd3908822beb09.gif');" alt="��ͼƬ�ѱ���С�������鿴ԭ��СͼƬ��" src="http://cache45.51.com/photo5/f4/1c/linuwa/f200ce85ff603dc59cdd3908822beb09.gif" width="980" onload="if(this.width&gt;screen.width-300) {this.width=screen.width-300;this.alt='��ͼƬ�ѱ���С�������鿴ԭ��СͼƬ��';}" border="0" />
						<br />
						<br />
						<br />
						<br />
						<br />
						<br />
						<br />
						<img style="-MS-INTERPOLATION-MODE: nearest-neighbor" height="1252" src="http://www.linuxsir.org/bbs/attachment.php?attachmentid=30699&amp;d=1132376940" width="1218" />
				</strong>
		</p>
<img src ="http://www.cnitblog.com/charester/aggbug/20943.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cnitblog.com/charester/" target="_blank">天空</a> 2006-12-21 21:01 <a href="http://www.cnitblog.com/charester/archive/2006/12/21/20943.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>VI 学习（三）屏幕文本编辑器Vi</title><link>http://www.cnitblog.com/charester/archive/2006/12/21/20940.html</link><dc:creator>天空</dc:creator><author>天空</author><pubDate>Thu, 21 Dec 2006 12:49:00 GMT</pubDate><guid>http://www.cnitblog.com/charester/archive/2006/12/21/20940.html</guid><wfw:comment>http://www.cnitblog.com/charester/comments/20940.html</wfw:comment><comments>http://www.cnitblog.com/charester/archive/2006/12/21/20940.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cnitblog.com/charester/comments/commentRss/20940.html</wfw:commentRss><trackback:ping>http://www.cnitblog.com/charester/services/trackbacks/20940.html</trackback:ping><description><![CDATA[
		<div id="post_message_27083" style="OVERFLOW-X: hidden">屏幕文本编辑器Vi<br /><br />本章介绍Linux上最常用的文本编辑器Vi。文本编辑器是所有计算机系统中最常使用的一种工具。用户在使用计算机的时候，往往需要建立自己的文件，无论是一般的文本文件、数据文件，还是编写的源程序文件，这些工作都离不开编辑器。<br /><br />Linux系统提供了一个完整的编辑器家族系列，如Ed、Ex、Vi和Emacs等，按功能它们可以分为两大类：行编辑器（Ed、Ex）和全屏幕编辑器（Vi、Emacs）。行编辑器每次只能对一行进行操作，使用起来很不方便。而全屏幕编辑器可以对整个屏幕进行编辑，用户编辑的文件直接显示在屏幕上，修改的结果可以立即看出来，克服了行编辑的那种不直观的操作方式，便于用户学习和使用，具有强大的功能。<br /><br />Vi是Linux系统的第一个全屏幕交互式编辑程序，它从诞生至今一直得到广大用户的青睐，历经数十年仍然是人们主要使用的文本编辑工具，足见其生命力之强，而强大的生命力是其强大的功能带来的。<br /><br />本章中，我们将循序渐进地介绍如何使用Vi来建立、编辑、显示以及处理文件。（注：文中的大写字母为［shift］键+相应的小写字母的组合）<br /><br />　Vi简介<br /><br />Vi是“Visual interface”的简称，它在Linux上的地位就仿佛Edit程序在DOS上一样。它可以执行输出、删除、查找、替换、块操作等众多文本操作，而且用户可以根据自己的需要对其进行定制，这是其他编辑程序所没有的。<br /><br />Vi不是一个排版程序，它不象Word或WPS那样可以对字体、格式、段落等其他属性进行编排，它只是一个文本编辑程序。<br /><br />Vi没有菜单，只有命令，且命令繁多。Vi有三种基本工作模式：命令行模式、文本输入模式和末行模式。<br /><br />命令行模式<br /><br />任何时候，不管用户处于何种模式，只要按一下键，即可使Vi进入命令行模式；我们在shell环境（提示符为$）下输入启动Vi命令，进入编辑器时，也是处于该模式下。<br /><br />在该模式下，用户可以输入各种合法的Vi命令，用于管理自己的文档。此时从键盘上输入的任何字符都被当做编辑命令来解释，若输入的字符是合法的Vi命令，则Vi在接受用户命令之后完成相应的动作。但需注意的是，所输入的命令并不在屏幕上显示出来。若输入的字符不是Vi的合法命令，Vi会响铃报警。<br /><br />文本输入模式<br /><br />在命令模式下输入插入命令i、附加命令a 、打开命令o、修改命令c、取代命令r或替换命令s都可以进入文本输入模式。在该模式下，用户输入的任何字符都被Vi当做文件内容保存起来，并将其显示在屏幕上。在文本输入过程中，若想回到命令模式下，按键即可。<br /><br />末行模式<br /><br />末行模式也称ex转义模式。<br /><br />Vi和Ex编辑器的功能是相同的，二者主要区别是用户界面。在Vi中，命令通常是单个键，例如i、a、o等；而在Ex中，命令是以按回车键结束的正文行。Vi有一个专门的“转义”命令，可访问很多面向行的Ex命令。在命令模式下，用户按“:”键即可进入末行模式下，此时Vi会在显示窗口的最后一行（通常也是屏幕的最后一行）显示一个“:”作为末行模式的提示符，等待用户输入命令。多数文件管理命令都是在此模式下执行的（如把编辑缓冲区的内容写到文件中等）。末行命令执行完后，Vi自动回到命令模式。例如：<br /><br />:1，$s / A / a / g<br /><br />则从文件第一行至文件尾将大写A全部替换成小写a。<br /><br />若在末行模式下输入命令过程中改变了主意，可按键，或用退格键将输入的命令全部删除之后，再按一下退格键，即可使Vi回到命令模式下。<br /><br />Vi编辑器的三种工作模式之间的转换如图11-1所示。<br /><br /><br />　<br /><br />如果要从命令模式转换到编辑模式，可以键入命令a或者i；如果需要从文本模式返回，则按Esc键即可。在命令模式下输入“:”即可切换到末行模式，然后输入命令。<br /><br />第二十五课 Vi的进入与退出　　　　　　2000年/6月/13日<br /><br /><br />Vi 的进入<br /><br />用户登录到系统中之后，系统给出提示符“$”。在提示符后键入Vi和想要编辑（或建立）的文件名，便可进入Vi。<br /><br />［例1］ 键入命令：<br /><br />$ vi example.c<br /><br />屏幕显示如下：<br /><br /><br />~<br /><br />~<br /><br />~<br /><br />~<br /><br />~<br /><br />~<br /><br />~<br /><br />~<br /><br />~<br /><br />~<br /><br />~<br /><br />~<br /><br />~<br /><br />“ example.c” ［New File］<br /><br />如果只键入Vi，而不带文件名，也可以进入Vi。之后在光标处键入文件内容，退出Vi时，只需在退出命令后输入文件名即可。<br /><br />进入Vi之后，首先进入的就是命令模式，也就是说等待命令输入而不是文本输入。这时输入的字母都将作为命令来解释。光标停在屏幕第一行首位上（用表示），其余各行行首均有一个“~”符号，表示该行为空行。最后一行也称状态行，显示出当前正在编辑的文件名以及其状态。如本例是［New File］，表示example.c是一个新建的文件。如果example.c文件已在系统中存在，那么输入上述命令后，则在屏幕上显示出该文件的内容，并且光标停在第一行的首位，在状态行显示出该文件的文件名、行数和字符数。<br /><br />［例2］ 键入命令：<br /><br />$ vi example.c<br /><br />然后键入：<br /><br />#include<br /><br />main （ ）<br /><br />{ int k ;<br /><br />for （ k=0 ; k&lt;3 ; k++） add（ ）;<br /><br />}<br /><br />add（ ）<br /><br />{ static int x=0;<br /><br />x++ ;<br /><br />printf（“x = %d\n”, x）;<br /><br />}<br /><br /><br />~<br /><br />~<br /><br />~<br /><br />~<br /><br />“ example.c” ［ New File］<br /><br />注意，在这里我们为了节省篇幅起见，屏幕只显示15行。事实上，初始的显示行数与用户所用终端有关，一般的CRT终端可显示25行。在窗口系统中，显示行数与运行Vi的那个窗口有关。然而我们可以对显示行数进行设置。例如，在能显示25行的CRT终端上，让Vi只显示15行。设置的方法将在本节后面介绍。<br /><br />当用Vi建立一个新文件时，在进入Vi的命令中也可以不给出文件名，当编辑完文件需要保存数据时，再由用户指定文件名。<br /><br />进入Vi时，用户不仅可以指定一个待编辑的文件名，而且还有许多附加操作。<br /><br /><br />如果希望在进入Vi之后，光标处于文件中特定的某行上，可在Vi后加上任选项+n，其中n为指定的行数。<br /><br />［例3］ 键入命令：<br /><br />$ vi +5 example1.c<br /><br />后，屏幕显示如下：<br /><br />#include<br /><br />main （ ）<br /><br />{ int k ;<br /><br />for （ k=0 ; k&lt;3 ; k++） add（ ）;<br /><br />}<br /><br />add（ ）<br /><br />{ static int x=0;<br /><br />x++ ;<br /><br />printf（“x = %d\n”, x）;<br /><br />}<br /><br />~<br /><br />~<br /><br />~<br /><br />~<br /><br />~<br /><br />“ example.c” 12 lines, 125 characters<br /><br />光标将位于文件example1.c中的第5行上。<br /><br />如果希望在进入Vi之后光标处于文件最末行，则只需把命令中附加项“+”后面的数字n省略掉即可。<br /><br /><br />在进入Vi时，除了可以指定一个光标起始行号之外，还可以在命令中指定一个模式串，此时在进入Vi后，光标就处于文件中第一个与指定模式串相匹配的那行上。<br /><br />［例4］ 键入命令：<br /><br />$ vi +/int example1.c<br /><br />屏幕显示如下：<br /><br />#include<br /><br />main （ ）<br /><br />{ int k ;<br /><br />for （ k=0 ; k&lt;3 ; k++） add（ ）;<br /><br />}<br /><br />add（ ）<br /><br />{ static int x=0;<br /><br />x++ ;<br /><br />printf（“x = %d\n”, x）;<br /><br />}<br /><br />~<br /><br />~<br /><br />~<br /><br />~<br /><br />~<br /><br />“ example.c” 12 lines, 125 characters<br /><br />光标将位于文件example1.c中的第3行上。<br /><br /><br />使用Vi可以同时编辑多个文件，只要在进入Vi的命令中写入所要操作的文件即可，还可以使用通配符。<br /><br />［例5］ 键入命令：<br /><br />$ vi *.cat<br /><br />就可以编辑所有后缀为cat的文件了。当然，您还可以使用shell中内置的模式匹配来装载文件，这样会更富技巧性。一旦您在命令行中包含了所有的待编辑文件名，就可以在Vi中方便地移来移去。<br /><br />退出Vi<br /><br />当编辑完文件，准备退出Vi返回到shell时，可以使用以下几种方法之一。<br /><br /><br />在命令模式中，连按两次大写字母Z，若当前编辑的文件曾被修改过，则Vi保存该文件后退出，返回到shell；若当前编辑的文件没被修改过，则Vi直接退出, 返回到shell。<br /><br /><br />在末行模式下，输入命令<br /><br />:w<br /><br />Vi保存当前编辑文件，但并不退出，而是继续等待用户输入命令。在使用w命令时，可以再给编辑文件起一个新的文件名。<br /><br /><br />［例6］<br /><br />:w newfile<br /><br />此时Vi将把当前文件的内容保存到指定的newfile中，而原有文件保持不变。若newfile是一个已存在的文件，则Vi在显示窗口的状态行给出提示信息：<br /><br />File exists （use ! to override）<br /><br />此时，若用户真的希望用文件的当前内容替换newfile中原有内容，可使用命令<br /><br />:w! newfile<br /><br />否则可选择另外的文件名来保存当前文件。<br /><br /><br />在末行模式下，输入命令<br /><br />:q<br /><br />系统退出Vi返回到shell。若在用此命令退出Vi时，编辑文件没有被保存，则Vi在显示窗口的最末行显示如下信息：<br /><br />No write since last change （use ! to overrides）<br /><br />提示用户该文件被修改后没有保存，然后Vi并不退出，继续等待用户命令。若用户就是不想保存被修改后的文件而要强行退出Vi时，可使用命令<br /><br />:q!<br /><br />Vi放弃所作修改而直接退到shell下。<br /><br /><br />在末行模式下，输入命令<br /><br />:wq<br /><br />Vi将先保存文件，然后退出Vi返回到shell。<br /><br /><br />在末行模式下，输入命令<br /><br />:x<br /><br />该命令的功能同命令模式下的ZZ命令功能相同。</div>
		<!-- / message -->
		<!-- sig -->
		<br />
		<br />
		<div id="post_message_27084" style="OVERFLOW-X: hidden">Vi中的行号<br /><br />Vi中的许多命令都要用到行号及行数等数值。若编辑的文件较大时，自己去数是非常不方便的。为此Vi提供了给文本加行号的功能。这些行号显示在屏幕的左边，而相应行的内容则显示在行号之后。<br /><br />使用的命令为：在末行方式下输入命令：<br /><br />:set number<br /><br />需要说明的是，这里加的行号只是显示给用户看的，它们并不是文件内容的一部分。<br /><br />在一个较大的文件中，用户可能需要了解光标当前行是哪一行，在文件中处于什么位置，可在命令模式下用组合键&lt;Ctrl+g&gt;，此时Vi会在显示窗口的最后一行显示出相应信息。该命令可以在任何时候使用。<br /><br />［例7］<br /><br />#include &lt;stdio.h&gt;<br /><br />main （ ）<br /><br />{ int k ;<br /><br />for （ k=0 ; k&lt;3 ; k++） add（ ）;<br /><br />}<br /><br />add（ ）<br /><br />{ static int x=0;<br /><br />x++ ;<br /><br />printf（“x = %d\n”, x）;<br /><br />}<br /><br />~<br /><br />~<br /><br />~<br /><br />~<br /><br />~<br /><br />“ example.c” ［Modified］ lines 4 of 10 --40%-- col 11<br /><br />在末行方式下，我们可以输入命令nu（单词number的缩写）来获得光标当前行的行号与该行内容。<br /><br />光标移动操作<br /><br />全屏幕文本编辑器中，光标的移动操作无疑是最经常使用的操作了。用户只有熟练地使用移动光标的这些命令，才能迅速准确地到达所期望的位置处进行编辑。<br /><br />Vi中的光标移动既可以在命令模式下，也可以在文本输入模式下，但操作的方法不尽相同。<br /><br />在文本输入模式下，可直接使用键盘上的四个方向键移动光标。<br /><br />在命令模式下，有很多移动光标的方法。不但可以使用四个方向键来移动光标，还可以用h、j、k、l这四个键代替四个方向键来移动光标，这样可以避免由于不同机器上的不同键盘定义所带来的矛盾，而且使用熟练后可以手不离开字母键盘位置就能完成所有操作，从而提高工作效率。另外还可以用&lt;Spacebar&gt;、&lt;Backspace&gt;、&lt;Ctrl+n&gt;和&lt;ctrl+p&gt;四个键或组合键移动光标。且以上这三种键在实现功能上是等价的。除此之外，还有一些移动光标的命令。下面对它们的工作方式介绍如下：<br /><br />&lt;Spacebar&gt;、® （均称为右向键）<br /><br />右向键的作用是将光标向右移动一个位置。若在向右键前先输入一个数字n，那么光标就向右移动n个位置。例如5l表示光标向右移动5个位置。需要注意的是，光标移动不能超过当前行的末尾。若给定的n超过光标当前位置至行尾的字符个数，如果用右向键，光标只能移到行尾；如果用&lt;Spacebar&gt;，光标移到下面一行或几行的适当位置。<br /><br />h、&lt;Backspace&gt;、¬ （向左键）<br /><br />执行一次向左键，光标向左移动一个位置。同向右键一样，也可以在向左键的前面输入一个数字n，那么光标就向左移动n个位置。需要注意的是，如果用左向键，光标左移不能超出该行的开头；如果用&lt;Backspace&gt;，光标移到上面一行或几行的适当位置。<br /><br />j、&lt;Ctrl+n&gt;、¯ （向下键）<br /><br />执行一次向下键光标向下移动一个位置（即一行），但光标所在的列不变。当这些命令前面加上数字n，则光标下移n行。<br /><br />Vi除了可以用向下键将光标下移外，还可以用&lt;Enter&gt;键和“+”键将光标下移一行或n行（不包括本行在内），但此时光标下移之后将位于该行的第一个字符处。例如：<br /><br />3j 光标下移3行，且光标所在列的位置不变。<br /><br />3+或3&lt;Enter&gt; 光标下移3行，且光标位于该行的行首。<br /><br />k、&lt;Ctrl+p&gt;、­ （向上键）<br /><br />执行一次向上键光标向上移动一个位置（即一行），但光标所在的列不变。同样在这些命令前面加上数字n，则光标上移n行。<br /><br />若希望光标上移之后，光标位于该行的行首，则可以使用命令“- ”。<br /><br />L （移至行首）<br /><br />L 命令是将光标移到当前行的开头，即将光标移至当前行的第一个非空白处（非制表符或非空格符）。<br /><br />$（移至行尾）<br /><br />该命令将光标移到当前行的行尾，停在最后一个字符上。若在$命令之前加上一个数字n，则光标下移n-1行并到达行尾。<br /><br />［行号］ G（移至指定行）<br /><br />该命令将光标移至指定行号所指定的行的行首。这种移动称为绝对定位移动。<br /><br />［例8］<br /><br />#include &lt;stdio.h&gt;<br /><br />main （ ）<br /><br />{ int k ;<br /><br />for （ k=0 ; k&lt;3 ; k++） add（ ）;<br /><br />}<br /><br />add（ ）<br /><br />{ static int x=0;<br /><br />x++ ;<br /><br />printf（“x = %d\n”, x）;<br /><br />}<br /><br />~<br /><br />~<br /><br />~<br /><br />~<br /><br />~<br /><br />“ example.c” 12 lines, 125 characters<br /><br />键入命令:6G后，屏幕显示如下：<br /><br />#include &lt;stdio.h&gt;<br /><br />main （ ）<br /><br />{ int k ;<br /><br />for （ k=0 ; k&lt;3 ; k++） add（ ）;<br /><br />}<br /><br />add（ ）<br /><br />{ static int x=0;<br /><br />x++ ;<br /><br />printf（“x = %d\n”, x）;<br /><br />}<br /><br />~<br /><br />~<br /><br />~<br /><br />~<br /><br />~<br /><br />“ example.c” 12 lines, 125 characters<br /><br />光标移到了第6行的行首。<br /><br />若省略行号，则光标移至该文件的最后一行的行首，即无论该文件有多少屏，都跳至最后一行。<br /><br />第二十七课 vi命令　　　2000年/6月/26日<br /><br />　<br /><br />在屏幕上移动<br /><br />Vi提供了三个关于光标在全屏幕上移动并且文件本身不发生滚动的命令。它们分别是H、M和L命令。<br /><br />1. H命令<br /><br />该命令将光标移至屏幕首行的行首（即左上角），也就是当前屏幕的第一行，而不是整个文件的第一行。利用此命令可以快速将光标移至屏幕顶部。若在H命令之前加上数字n，则将光标移至第n行的行首。<br /><br />［例9］ 屏幕显示如下内容：<br /><br />#include &lt;stdio.h&gt;<br /><br />main （ ）<br /><br />{ int k ;<br /><br />for （ k=0 ; k&lt;3 ; k++） add（ ）; }<br /><br />add（ ）<br /><br />{ static int x=0;<br /><br />x++ ;<br /><br />printf（“x=%d\n”, x）;<br /><br />}<br /><br />~<br /><br />~<br /><br />~<br /><br />~<br /><br />~<br /><br />“ example.c” ［ New File］<br /><br />在命令模式下输入4H命令后，光标移到以for开头的这一行的字母f上。<br /><br />值得一提的是，使用命令dH将会删除从光标当前所在行至所显示屏幕首行的全部内容。<br />2. M命令<br /><br />该命令将光标移至屏幕显示文件的中间行的行首。即如果当前屏幕已经充满,则移动到整个屏幕的中间行；如果并未充满，则移动到文本的那些行的中间行。利用此命令可以快速地将光标从屏幕的任意位置移至屏幕显示文件的中间行的行首。例如，在上面屏幕显示的情况下（不论光标在屏幕的何处），在命令模式下，输入命令M之后，光标都将移到add这一行的字母a上。<br /><br />同样值得一提的是，使用命令dM将会删除从光标当前所在行至屏幕显示文件的中间行的全部内容。<br />3. L命令<br /><br />当文件显示内容超过一屏时，该命令将光标移至屏幕上的最底行的行首；当文件显示内容不足一屏时，该命令将光标移至文件的最后一行的行首。可见，利用此命令可以快速准确地将光标移至屏幕底部或文件的最后一行。若在L命令之前加上数字n，则将光标移至从屏幕底部算起第n行的行首。例如，在上面屏幕显示的情况下（不论光标在屏幕的何处），在命令模式下，输入命令3L之后，光标都将移到x++这一行的字母x上。<br /><br />同样值得一提的是，使用命令dL将会删除从光标当前行至屏幕底行的全部内容。<br /><br />按字移动光标<br /><br />首先介绍一下Vi中“字”的概念。在Vi中“字”有两种含义。一种是广义的字，它可以是两个空格之间的任何内容。<br /><br />［例10］ 在文件example.c 中的第4行：<br /><br />{int k；<br /><br />它只有2个字，一个是{int ，另一个是k;<br /><br />Vi中另一种字是狭义上的字，在此种意义之下，英文单词、标点符号和非字母字符（如!、@、#、$、%、^、&amp;、*、（、）、-、+、{、}、［、］、~、|、\、&lt;、&gt;、/等）均被当成是一个字。因此，上面那一行中就包括{、int、k、；这4个字。<br /><br />Vi中使用大写命令一般就是指将字作为广义来对待，使用小写命令就是作为狭义对待。<br /><br />搞清楚Vi中字的含义后，我们就可以介绍按字移动光标的命令了。<br /><br />Vi 一共提供了三组关于按字移动光标的命令，分别是：<br /><br />1. w和W命令<br /><br />将光标右移至下一个字的字首；<br /><br />［例11］ 屏幕上显示如下：<br /><br />printf（“Hello Mr.Huang!\n”）;<br /><br />现在使用w命令，把光标移到下一个字（狭义）的字首“（”上：<br /><br />printf（“Hello Mr.Huang!\n”）;<br /><br />下面使用W命令，将把光标移到下一个字（广义）的字首“M”上：<br /><br />printf（“Hello Mr.Huang!\n”）;<br />2. e和E命令<br /><br />如果光标起始位置处于字内（即非字尾处），则该命令将把光标移到本字字尾；如果光标起始位置处于字尾，则该命令将把光标移动到下一个字的字尾。<br />3. b和B<br /><br />如果光标处于所在字内（即非字首），则该命令将把光标移至本字字首；如果光标处于所在字字首，则该命令将把光标移到上一个字的字首。<br /><br />［例12］ 屏幕显示如下：<br /><br />printf（“Hello Mr.Huang!\n”）;<br /><br />现在使用b命令，由于光标处于该字中间，所以光标移动到本字字首“H”处：<br /><br />printf（“Hello Mr.Huang!\n”）;<br /><br />如果使用B命令，则如下所示：<br /><br />printf（“Hello Mr.Huang!\n”）;<br /><br />按句移动光标<br /><br />在Vi中，一个句子被定义为是以逗号（,）、句号（.）、问号（?）和感叹号（!）结尾，且其后面跟着至少两个以上（含两个）空格或一个换行符的字符序列。<br /><br />Vi提供了关于按句移动光标的两个命令，分别为：<br /><br />1. （ 命令<br /><br />将光标移至上一个句子的开头。<br /><br />2. ） 命令<br /><br />该命令将光标移至下一个句子的开头。<br /><br />按段移动光标<br /><br />在Vi中，一个段被定义为是以一个空白行开始和结束的片段。Vi提供了关于按段移动光标的两个命令，分别为：<br /><br />1. { 命令<br /><br />该命令将光标向前移至上一个段的开头；<br /><br />2. } 命令<br /><br />该命令将光标向后移至下一个段的开头。<br /><br />屏幕滚动<br /><br />屏幕命令是以屏幕为单位移动光标的，常用于文件的滚屏和分页。需要注意的是，屏幕命令不是光标移动命令，不能作为文本限定符用于删除命令中。<br /><br />在命令模式下和文本输入模式下均可以使用屏幕滚动命令。<br /><br />　<br /><br />1. 滚屏命令<br /><br />关于滚屏命令有两个：<br /><br />· &lt; Ctrl+u &gt; 将屏幕向前（文件头方向）翻滚半屏；<br /><br />· &lt; Ctrl+d &gt; 将屏幕向后（文件尾方向）翻滚半屏。<br /><br />可以在这两个命令之前加上一个数字n，则屏幕向前或向后翻滚n行。并且这个值被系统记住，以后再用&lt; Ctrl+u &gt;和&lt; Ctrl+d &gt;命令滚屏时，还滚相应的行数。<br /><br />2. 分页命令<br /><br />关于分页命令也有两个：<br /><br />· &lt; Ctrl+f &gt; 将屏幕向文件尾方向翻滚一整屏（即一页）；<br /><br />· &lt; Ctrl+b &gt; 将屏幕向文件首方向翻滚一整屏（即一页）。<br /><br />同样也可以在这两个命令之前加上一个数字n，则屏幕向前或向后移动n页。<br /><br />3. 状态命令&lt; Ctrl+G &gt;<br /><br />命令显示在vi状态行上的vi状态信息，包括正在编辑的文件名、是否修改过、当前行号、文件的行数以及光标之前的行占整个文件的百分比。<br /><br />4. 屏幕调零命令<br /><br />Vi 提供了三个有关屏幕调零的命令。它们的格式分别为：<br /><br />· ［行号］ z ［行数］ &lt;回车&gt;<br /><br />· ［行号］ z ［行数］ .<br /><br />· ［行号］ z ［行数］ _<br /><br />若省略了行号和行数，这三个命令分别为将光标所在的当前行作为屏幕的首行、中间行和最末行重新显示；若给出行号，那么该行号所对应的行就作为当前行显示在屏幕的首行、中间行和最末行；若给出行数，则它规定了在屏幕上显示的行数。<br /><br />［例13］<br /><br />8z16&lt;回车&gt; ：将文件中的第8行作为屏幕显示的首行，并一共显示16行。<br /><br />15z . ：将文件中的第15行作为屏幕显示的中间行，显示行数为整屏。<br /><br />15z 5_ ：将文件中的第15行作为屏幕显示的最末行，显示行数为5行。<br /><br />文本插入操作<br /><br />在命令模式下用户输入的任何字符都被Vi当作命令加以解释执行，如果用户要将输入的字符当作是文本内容时，则首先应将Vi的工作模式从命令模式切换到文本输入模式。切换的方式是使用下面的命令。<br /><br />　<br /><br />插入（Insert）命令<br /><br />Vi提供了两个插入命令：i和 I。<br /><br />　<br /><br />　<br /><br />1. i命令<br /><br />插入文本从光标所在位置前开始,并且插入过程中可以使用&lt;Backspace&gt;键删除错误的输入。此时Vi处于插入状态，屏幕最下行显示“--INSERT--”（插入）字样。<br /><br />［例14］ 有一正在编辑的文件，如下所示：<br /><br />Welcome to vi world!Come on!<br /><br />~<br /><br />~<br /><br />光标位于第一个“!”上，需在其前面插入：<br /><br />This is an example!<br /><br />使用i命令，并输入相应文本后，屏幕显示如下：<br /><br />Welcome to vi world This is an example!!Come on!<br /><br />~<br /><br />~<br /><br />由此例可以看到，光标本来是在第一个“!”处，但是由于是从光标所在位置前开始插入，所以这个“!”就被挤到了新插入的文本之后。<br />2. I命令<br /><br />该命令是将光标移到当前行的行首，然后在其前插入文本。</div>
		<!-- / message -->
		<!-- sig -->
		<br />
		<br />
		<br />
		<br />
		<br />
		<div id="post_message_27085" style="OVERFLOW-X: hidden">vi命令<br /><br />在屏幕上移动<br /><br />Vi提供了三个关于光标在全屏幕上移动并且文件本身不发生滚动的命令。它们分别是H、M和L命令。<br /><br />1. H命令<br /><br />该命令将光标移至屏幕首行的行首（即左上角），也就是当前屏幕的第一行，而不是整个文件的第一行。利用此命令可以快速将光标移至屏幕顶部。若在H命令之前加上数字n，则将光标移至第n行的行首。<br /><br />［例9］ 屏幕显示如下内容：<br /><br />#include &lt;stdio.h&gt;<br /><br />main （ ）<br /><br />{ int k ;<br /><br />for （ k=0 ; k&lt;3 ; k++） add（ ）; }<br /><br />add（ ）<br /><br />{ static int x=0;<br /><br />x++ ;<br /><br />printf（“x=%d\n”, x）;<br /><br />}<br /><br />~<br /><br />~<br /><br />~<br /><br />~<br /><br />~<br /><br />“ example.c” ［ New File］<br /><br />在命令模式下输入4H命令后，光标移到以for开头的这一行的字母f上。<br /><br />值得一提的是，使用命令dH将会删除从光标当前所在行至所显示屏幕首行的全部内容。<br />2. M命令<br /><br />该命令将光标移至屏幕显示文件的中间行的行首。即如果当前屏幕已经充满,则移动到整个屏幕的中间行；如果并未充满，则移动到文本的那些行的中间行。利用此命令可以快速地将光标从屏幕的任意位置移至屏幕显示文件的中间行的行首。例如，在上面屏幕显示的情况下（不论光标在屏幕的何处），在命令模式下，输入命令M之后，光标都将移到add这一行的字母a上。<br /><br />同样值得一提的是，使用命令dM将会删除从光标当前所在行至屏幕显示文件的中间行的全部内容。<br />3. L命令<br /><br />当文件显示内容超过一屏时，该命令将光标移至屏幕上的最底行的行首；当文件显示内容不足一屏时，该命令将光标移至文件的最后一行的行首。可见，利用此命令可以快速准确地将光标移至屏幕底部或文件的最后一行。若在L命令之前加上数字n，则将光标移至从屏幕底部算起第n行的行首。例如，在上面屏幕显示的情况下（不论光标在屏幕的何处），在命令模式下，输入命令3L之后，光标都将移到x++这一行的字母x上。<br /><br />同样值得一提的是，使用命令dL将会删除从光标当前行至屏幕底行的全部内容。<br /><br />按字移动光标<br /><br />首先介绍一下Vi中“字”的概念。在Vi中“字”有两种含义。一种是广义的字，它可以是两个空格之间的任何内容。<br /><br />［例10］ 在文件example.c 中的第4行：<br /><br />{int k；<br /><br />它只有2个字，一个是{int ，另一个是k;<br /><br />Vi中另一种字是狭义上的字，在此种意义之下，英文单词、标点符号和非字母字符（如!、@、#、$、%、^、&amp;、*、（、）、-、+、{、}、［、］、~、|、\、&lt;、&gt;、/等）均被当成是一个字。因此，上面那一行中就包括{、int、k、；这4个字。<br /><br />Vi中使用大写命令一般就是指将字作为广义来对待，使用小写命令就是作为狭义对待。<br /><br />搞清楚Vi中字的含义后，我们就可以介绍按字移动光标的命令了。<br /><br />Vi 一共提供了三组关于按字移动光标的命令，分别是：<br /><br />1. w和W命令<br /><br />将光标右移至下一个字的字首；<br /><br />［例11］ 屏幕上显示如下：<br /><br />printf（“Hello Mr.Huang!\n”）;<br /><br />现在使用w命令，把光标移到下一个字（狭义）的字首“（”上：<br /><br />printf（“Hello Mr.Huang!\n”）;<br /><br />下面使用W命令，将把光标移到下一个字（广义）的字首“M”上：<br /><br />printf（“Hello Mr.Huang!\n”）;<br />2. e和E命令<br /><br />如果光标起始位置处于字内（即非字尾处），则该命令将把光标移到本字字尾；如果光标起始位置处于字尾，则该命令将把光标移动到下一个字的字尾。<br />3. b和B<br /><br />如果光标处于所在字内（即非字首），则该命令将把光标移至本字字首；如果光标处于所在字字首，则该命令将把光标移到上一个字的字首。<br /><br />［例12］ 屏幕显示如下：<br /><br />printf（“Hello Mr.Huang!\n”）;<br /><br />现在使用b命令，由于光标处于该字中间，所以光标移动到本字字首“H”处：<br /><br />printf（“Hello Mr.Huang!\n”）;<br /><br />如果使用B命令，则如下所示：<br /><br />printf（“Hello Mr.Huang!\n”）;<br /><br />按句移动光标<br /><br />在Vi中，一个句子被定义为是以逗号（,）、句号（.）、问号（?）和感叹号（!）结尾，且其后面跟着至少两个以上（含两个）空格或一个换行符的字符序列。<br /><br />Vi提供了关于按句移动光标的两个命令，分别为：<br /><br />1. （ 命令<br /><br />将光标移至上一个句子的开头。<br /><br />2. ） 命令<br /><br />该命令将光标移至下一个句子的开头。<br /><br />按段移动光标<br /><br />在Vi中，一个段被定义为是以一个空白行开始和结束的片段。Vi提供了关于按段移动光标的两个命令，分别为：<br /><br />1. { 命令<br /><br />该命令将光标向前移至上一个段的开头；<br /><br />2. } 命令<br /><br />该命令将光标向后移至下一个段的开头。<br /><br />屏幕滚动<br /><br />屏幕命令是以屏幕为单位移动光标的，常用于文件的滚屏和分页。需要注意的是，屏幕命令不是光标移动命令，不能作为文本限定符用于删除命令中。<br /><br />在命令模式下和文本输入模式下均可以使用屏幕滚动命令。<br /><br />　<br /><br />1. 滚屏命令<br /><br />关于滚屏命令有两个：<br /><br />· &lt; Ctrl+u &gt; 将屏幕向前（文件头方向）翻滚半屏；<br /><br />· &lt; Ctrl+d &gt; 将屏幕向后（文件尾方向）翻滚半屏。<br /><br />可以在这两个命令之前加上一个数字n，则屏幕向前或向后翻滚n行。并且这个值被系统记住，以后再用&lt; Ctrl+u &gt;和&lt; Ctrl+d &gt;命令滚屏时，还滚相应的行数。<br /><br />2. 分页命令<br /><br />关于分页命令也有两个：<br /><br />· &lt; Ctrl+f &gt; 将屏幕向文件尾方向翻滚一整屏（即一页）；<br /><br />· &lt; Ctrl+b &gt; 将屏幕向文件首方向翻滚一整屏（即一页）。<br /><br />同样也可以在这两个命令之前加上一个数字n，则屏幕向前或向后移动n页。<br /><br />3. 状态命令&lt; Ctrl+G &gt;<br /><br />命令显示在vi状态行上的vi状态信息，包括正在编辑的文件名、是否修改过、当前行号、文件的行数以及光标之前的行占整个文件的百分比。<br /><br />4. 屏幕调零命令<br /><br />Vi 提供了三个有关屏幕调零的命令。它们的格式分别为：<br /><br />· ［行号］ z ［行数］ &lt;回车&gt;<br /><br />· ［行号］ z ［行数］ .<br /><br />· ［行号］ z ［行数］ _<br /><br />若省略了行号和行数，这三个命令分别为将光标所在的当前行作为屏幕的首行、中间行和最末行重新显示；若给出行号，那么该行号所对应的行就作为当前行显示在屏幕的首行、中间行和最末行；若给出行数，则它规定了在屏幕上显示的行数。<br /><br />［例13］<br /><br />8z16&lt;回车&gt; ：将文件中的第8行作为屏幕显示的首行，并一共显示16行。<br /><br />15z . ：将文件中的第15行作为屏幕显示的中间行，显示行数为整屏。<br /><br />15z 5_ ：将文件中的第15行作为屏幕显示的最末行，显示行数为5行。<br /><br />文本插入操作<br /><br />在命令模式下用户输入的任何字符都被Vi当作命令加以解释执行，如果用户要将输入的字符当作是文本内容时，则首先应将Vi的工作模式从命令模式切换到文本输入模式。切换的方式是使用下面的命令。<br /><br />　<br /><br />插入（Insert）命令<br /><br />Vi提供了两个插入命令：i和 I。<br /><br />　<br /><br />　<br /><br />1. i命令<br /><br />插入文本从光标所在位置前开始,并且插入过程中可以使用&lt;Backspace&gt;键删除错误的输入。此时Vi处于插入状态，屏幕最下行显示“--INSERT--”（插入）字样。<br /><br />［例14］ 有一正在编辑的文件，如下所示：<br /><br />Welcome to vi world!Come on!<br /><br />~<br /><br />~<br /><br />光标位于第一个“!”上，需在其前面插入：<br /><br />This is an example!<br /><br />使用i命令，并输入相应文本后，屏幕显示如下：<br /><br />Welcome to vi world This is an example!!Come on!<br /><br />~<br /><br />~<br /><br />由此例可以看到，光标本来是在第一个“!”处，但是由于是从光标所在位置前开始插入，所以这个“!”就被挤到了新插入的文本之后。<br />2. I命令<br /><br />该命令是将光标移到当前行的行首，然后在其前插入文本。<br /><br /><br /><br />}<br /><br />第二十九课 vi命令　　　2000年/7月/10日<br /><br />　<br /><br />　<br /><br />附加（append）命令<br /><br />Vi提供了两个附加插入命令：a和A。<br /><br />1. a命令<br /><br />该命令用于在光标当前所在位置之后追加新文本。新输入的文本放在光标之后，在光标后的原文本将相应地向后移动。光标可在一行的任何位置。<br /><br />［例15］ 以例14原始情况为例，使用a命令，并输入相应文本，屏幕显示如下：<br /><br />Welcome to vi world!This is an example!Come on!<br /><br />~<br /><br />~<br /><br />本例中光标后的文本“Come on!”被新输入的文本挤到了后面。<br />2. A命令<br /><br />该命令与a命令不同的是，A命令将把光标挪到所在行的行尾，从那里开始插入新文本。当输入A命令后，光标自动移到该行的行尾。<br /><br />a和A命令是把文本插入到行尾的唯一方法。<br /><br />　<br /><br />打开（open）命令<br /><br />不论是Insert命令也好，还是append命令也好，所插入的内容都是从当前行中的某个位置开始的。若我们希望在某行之前或某行之后插入一些新行，则应使用open命令。<br /><br />Vi提供了两个打开命令：o和O。<br /><br />1. o命令<br /><br />该命令将在光标所在行的下面新开一行，并将光标置于该行的行首，等待输入文本。要注意，当使用&lt;Backspace&gt;删除字符时只能删除从插入模式开始的位置以后的字符，对于以前的字符不起作用。而且还可以在文本输入方式下输入一些控制字符，例如，Ctrl+l即是插入分页符，显示为^L。<br /><br />［例16］ 以例14的原始情况为例，只是这次要在当前行下面一行输入文本。使用o命令，并输入相应文本，屏幕显示如下：<br /><br />Welcome to vi world!Come on!<br /><br />This is an example!<br /><br />~<br /><br />~<br /><br />新输入的文本出现在原来文本所在行的下一行。<br />2. O命令<br /><br />和o命令相反，O命令是在光标所在行的上面插入一行，并将光标置于该行的行首，等待输入文本。<br /><br />［例17］ 与例14的原始情况相同，要在当前行的上面一行输入文本。使用O命令并输入文本后，屏幕显示如下：<br /><br />This is an example!<br /><br />Welcome to vi world!Come on!<br /><br />~<br /><br />~<br /><br />文本插入到了当前行之上。<br /><br />11.3.4　文本修改<br /><br />在命令模式下可以使用Vi提供的各种有关命令对文本进行修改，包括对文本内容的删除、复制、取代和替换等。<br /><br />　<br /><br />　<br /><br />文本删除<br /><br />在编辑文本时，经常需要删除一些不需要的文本，我们可以用&lt;Backspace&gt;键将输错或不需要的文本删除，但此时有一个限制就是当删到行头之后，再想删上面那行的内容是不可能的。<br /><br />在命令模式下，Vi提供了许多删除命令。这些命令大多是以d开头的。常用的有：<br /><br />1. 删除单个字符<br /><br />x： 删除光标处的字符。若在x之前加上一个数字n，则删除从光标所在位置开始向右的n个字符。<br /><br />X：删除光标前面的那个字符。若在X之前加上一个数字n，则删除从光标前面那个字符开始向左的n个字符。<br /><br />显然这两个命令是删除少量字符的快捷方法。<br /><br />2. 删除多个字符<br /><br />dd：删除光标所在的整行。在dd前可加上一个数字n，表示删除当前行及其后n-1行的内容。<br /><br />D或d$：两命令功能一样，都是删除从光标所在处开始到行尾的内容。<br /><br />d0：删除从光标前一个字符开始到行首的内容。<br /><br />dw：删除一个单词。若光标处在某个词的中间，则从光标所在位置开始删至词尾。同dd命令一样，可在dw之前加一个数字n，表示删除n个指定的单词。<br /><br />如果用户不小心进行了误删除操作，也不要紧，Vi提供了恢复误操作的命令，并且可以将恢复的内容移动，放在文本的任何地方。恢复命令用² np，其中n为寄存器号。这是因为Vi内部有9个用于维护删除操作的寄存器，分别用数字1，2，¼ ，9表示，它们分别保存以往用dd命令删除的内容。这些寄存器组成一个队列，例如最近一次使用dd命令删除的内容被放到寄存器1中；当下次再使用dd命令删除文本内容时，Vi将把寄存器1的内容转存到寄存器2中，而寄存器1中又将是最近一次dd命令删除的内容。以此类推，Vi可以保存有最近九次用dd命令删除的内容，而前面的用dd命令删除的内容则被抛弃。<br /><br />［例18］ 假设当前编辑文件为xu.c<br /><br />/* this is a example */<br /><br />#include &lt;stdio.h&gt;<br /><br />void main（ ）<br /><br />{<br /><br />int i , j ;<br /><br />printf（ “ please input a number : / n ” ）;<br /><br />scanf （ “ % d ” , &amp;i ） ;<br /><br />j = i + 100 ;<br /><br />printf （ “ /n j = % d /n ” , j ） ;<br /><br />return ;<br /><br />}<br /><br />我们对其进行如下操作：<br /><br />1. 将光标移至文件第一行，按dd命令，此时文件第一行的内容被删除，且被删除的内容保存在寄存器1中；<br />2. 按5j使光标下移至第一个printf语句行；<br />3. 按dd命令将该行删除，此时寄存器1中将保存刚刚被删除的内容：<br /><br />printf （“ please input a number :\ n ” ）;<br /><br />而寄存器1原有的内容：<br /><br />/* this is a example */<br /><br />则被保存到寄存器2中；<br /><br />在最末行模式下，也可以对文件内容进行删除，但它只能删除整行，一次可将某个指定范围内（起始行号，终止行号）的所有行全部删除。需要注意的是，用此种方法进行删除时，Vi并不把所删内容放入寄存器中，因而当发生误删除操作时，不能用² np命令恢复，只能用u命令进行有限的恢复。<br /><br />最后提一下，如何在文本输入方式时将所输入文本删除。用户使用&lt;Ctrl+u&gt;组合键即可，此时光标将返回插入开始的位置，并且Vi仍处于文本输入方式。<br /><br />　<br /><br />取消上一命令（Undo）<br /><br />取消上一命令（Undo），也称复原命令，是非常有用的命令，它可以取消前一次的误操作或不合适的操作对文件造成的影响，使之回复到这种误操作或不合适操作被执行之前的状态。<br /><br />取消上一命令有两种形式，在命令模式下键入字符u和U。它们的功能都是取消刚才输入的命令，恢复到原来的情况。小写u和大写U在具体细节上有所不同，二者的区别在于，大写U命令的功能是恢复到误操作命令前的情况，即如果插入命令后使用U命令，就删除刚刚插入的内容；如果删除命令后使用U命令，就相当于在光标处又插入刚刚删除的内容。这里把所有修改文本的命令都视为插入命令。也就是说，U命令只能取消前一步操作，如果用U命令撤消了前一步操作，当再按U键时，并不是撤消再前一步的操作，而是撤消了刚才U命令执行的操作，也就是又恢复到第一次使用U命令之前的状态，结果是什么都没做。而小写u命令的功能是把当前行恢复成被编辑前的状态，而不管此行被编辑了多少次。<br /><br />　<br /><br />［例19］ 原来屏幕显示内容为：<br /><br />#include &lt;stdio.h&gt;<br /><br />main （ ）<br /><br />{<br /><br />}<br /><br />在命令模式下输入命令o，插入一新行，输入需要插入的内容后再按&lt;Esc&gt;回到命令模式，屏幕显示内容为：<br /><br />#include &lt;stdio.h&gt;<br /><br />main （ ）<br /><br />{<br /><br />printf （ “ How do you do ! ” ） ;<br /><br />}<br /><br />若想取消这一插入操作，请按命令U后，屏幕恢复到原来显示的情况。<br /><br />注意：对于取消命令仍可以再使用取消命令。这时会产生一种“负负得正”的效果，文件状态将恢复到第一次执行取消命令之前的状态，如同没做任何操作一般。例如在上例中，再使用一次命令U，屏幕将显示的内容仍为插入后的内容。<br /><br />　<br /><br />重复命令（Redo）<br /><br />重复命令也是一个非常常用的命令。在文本编辑中经常会碰到需要机械地重复一些操作，这时就需要用到重复命令。它可以让用户方便地再执行一次前面刚完成的某个复杂的命令。<br /><br />重复命令只能在命令模式下工作，在该模式下按“.”键既可。执行一个重复命令时，其结果是依赖于光标当前位置的。<br /><br />［例20］ 屏幕显示内容为：<br /><br />#include &lt;stdio.h&gt;<br /><br />main （ ）<br /><br />{<br /><br />}<br /><br />输入命令o，并输入一行内容后，再&lt; Esc &gt;返回到命令模式下，屏幕显示内容为：<br /><br />#include &lt;stdio.h&gt;<br /><br />main （ ）<br /><br />{<br /><br />printf （ “ How do you do ! ” ） ;<br /><br />}<br /><br />此时输入命令“.”，屏幕显示内容为：<br /><br />#include &lt;stdio.h&gt;<br /><br />main （ ）<br /><br />{<br /><br />printf （ “ How do you do ! ” ） ;<br /><br />printf （ “ How do you do ! ” ） ;</div>
		<!-- / message -->
		<!-- sig -->
		<br />
		<br />
<img src ="http://www.cnitblog.com/charester/aggbug/20940.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cnitblog.com/charester/" target="_blank">天空</a> 2006-12-21 20:49 <a href="http://www.cnitblog.com/charester/archive/2006/12/21/20940.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>VI 学习（二）vi的使用方法 </title><link>http://www.cnitblog.com/charester/archive/2006/12/21/20939.html</link><dc:creator>天空</dc:creator><author>天空</author><pubDate>Thu, 21 Dec 2006 12:42:00 GMT</pubDate><guid>http://www.cnitblog.com/charester/archive/2006/12/21/20939.html</guid><wfw:comment>http://www.cnitblog.com/charester/comments/20939.html</wfw:comment><comments>http://www.cnitblog.com/charester/archive/2006/12/21/20939.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cnitblog.com/charester/comments/commentRss/20939.html</wfw:commentRss><trackback:ping>http://www.cnitblog.com/charester/services/trackbacks/20939.html</trackback:ping><description><![CDATA[
		<p class="MsoNormal" style="TEXT-INDENT: 18pt; mso-char-indent-count: 2.0; mso-char-indent-size: 12pt">
				<span lang="EN-US" style="FONT-SIZE: 9pt; mso-bidi-font-size: 12.0pt">vi有三种工作状态：命令状态，文本插入状态，最后一行状态<?XML:NAMESPACE PREFIX = O /?><o:p></o:p></span>
		</p>
		<p class="MsoNormal" style="MARGIN-LEFT: 14.2pt; TEXT-INDENT: -2.85pt; mso-char-indent-size: 12pt; tab-stops: list 29.35pt; mso-list: l2 level1 lfo4">
				<span lang="EN-US" style="FONT-SIZE: 9pt; FONT-FAMILY: Wingdings; mso-bidi-font-size: 12.0pt">Ø<span style="FONT: 7pt 'Times New Roman'">       </span></span>
				<span style="FONT-SIZE: 9pt; mso-bidi-font-size: 12.0pt">命令状态：是<span lang="EN-US">vi的初始状态及一般状态。在该状态下输入的内容均视为命令，调用命令后，若要返回初始状态，则需按〈Esc〉键。<o:p></o:p></span></span>
		</p>
		<p class="MsoNormal" style="TEXT-INDENT: 18pt; mso-char-indent-count: 2.0; mso-char-indent-size: 12pt">
				<span style="FONT-SIZE: 9pt; mso-bidi-font-size: 12.0pt">注意：命令状态下，其字母大小写在<span lang="EN-US">vi中是意义不同的的命令<o:p></o:p></span></span>
		</p>
		<p class="MsoNormal" style="TEXT-INDENT: 18pt; mso-char-indent-count: 2.0; mso-char-indent-size: 12pt">
				<span style="FONT-SIZE: 9pt; mso-bidi-font-size: 12.0pt">（小窍门：若不知道当前是在什么状态，可按几次〈<span lang="EN-US">Esc〉键，以确保处于命令状态。）<o:p></o:p></span></span>
		</p>
		<p class="MsoNormal" style="MARGIN-LEFT: 14.2pt; TEXT-INDENT: -2.85pt; mso-char-indent-size: 12pt; tab-stops: list 29.35pt; mso-list: l2 level1 lfo4">
				<span lang="EN-US" style="FONT-SIZE: 9pt; FONT-FAMILY: Wingdings; mso-bidi-font-size: 12.0pt">Ø<span style="FONT: 7pt 'Times New Roman'">       </span></span>
				<span style="FONT-SIZE: 9pt; mso-bidi-font-size: 12.0pt">插入状态：在命令状态调用插入命令后，进入插入状态，在此状态下输入的内容被视为文件内容，按〈<span lang="EN-US">Esc〉键回到命令状态。<o:p></o:p></span></span>
		</p>
		<p class="MsoNormal" style="MARGIN-LEFT: 14.2pt; TEXT-INDENT: -2.85pt; mso-char-indent-size: 12pt; tab-stops: list 29.35pt; mso-list: l2 level1 lfo4">
				<span lang="EN-US" style="FONT-SIZE: 9pt; FONT-FAMILY: Wingdings; mso-bidi-font-size: 12.0pt">Ø<span style="FONT: 7pt 'Times New Roman'">       </span></span>
				<span style="FONT-SIZE: 9pt; mso-bidi-font-size: 12.0pt">最后一行状态：用于存储文件、退出编辑、在<span lang="EN-US">vi中执行shell命令。在命令状态下输入引号中列出的任意一键均可进入该状态：“<span style="BACKGROUND: #d9d9d9; mso-shading: white; mso-pattern: gray-15 auto">：/ ？ ！</span>”。若要转换到命令状态，按<span style="BACKGROUND: #d9d9d9; mso-shading: white; mso-pattern: gray-15 auto">Enter</span>键即可。<o:p></o:p></span></span>
		</p>
		<p class="MsoNormal" style="TEXT-INDENT: 18pt; mso-char-indent-count: 2.0; mso-char-indent-size: 12pt">
				<span style="FONT-SIZE: 9pt; mso-bidi-font-size: 12.0pt">在<span lang="EN-US">vi中执行<span style="BACKGROUND: #d9d9d9; mso-shading: white; mso-pattern: gray-15 auto">shell</span>命令时，在命令前需加字符“<span style="BACKGROUND: #d9d9d9; mso-shading: white; mso-pattern: gray-15 auto">！</span>”。<o:p></o:p></span></span>
		</p>
		<p class="MsoNormal" style="TEXT-INDENT: 18pt; mso-char-indent-count: 2.0; mso-char-indent-size: 12pt">
				<span style="FONT-SIZE: 9pt; mso-bidi-font-size: 12.0pt">例：<span lang="EN-US">1 最后一行状态下，执行shell的列表命令<o:p></o:p></span></span>
		</p>
		<p class="MsoNormal" style="TEXT-INDENT: 18pt; mso-char-indent-count: 2.0; mso-char-indent-size: 12pt">
				<span style="FONT-SIZE: 9pt; mso-bidi-font-size: 12.0pt">：<span lang="EN-US" style="BACKGROUND: #d9d9d9; mso-shading: white; mso-pattern: gray-15 auto">!ls</span><span lang="EN-US"><o:p></o:p></span></span>
		</p>
		<p class="MsoNormal" style="TEXT-INDENT: 18pt; mso-char-indent-count: 2.0; mso-char-indent-size: 12pt">
				<span lang="EN-US" style="FONT-SIZE: 9pt; mso-bidi-font-size: 12.0pt"> <o:p></o:p></span>
		</p>
		<p class="MsoNormal" style="TEXT-INDENT: 18pt; mso-char-indent-count: 2.0; mso-char-indent-size: 12pt">
				<span lang="EN-US" style="FONT-SIZE: 9pt; mso-bidi-font-size: 12.0pt">file1<span style="mso-spacerun: yes">   </span>file2.f<span style="mso-spacerun: yes">   </span>test.c<span style="mso-spacerun: yes">  </span>…<span style="mso-spacerun: yes">  </span>（当前目录中的文件表）<o:p></o:p></span>
		</p>
		<p class="MsoNormal" style="TEXT-INDENT: 18pt; mso-char-indent-count: 2.0; mso-char-indent-size: 12pt">
				<span style="FONT-SIZE: 9pt; mso-bidi-font-size: 12.0pt">… …<span lang="EN-US"><o:p></o:p></span></span>
		</p>
		<p class="MsoNormal" style="TEXT-INDENT: 18pt; mso-char-indent-count: 2.0; mso-char-indent-size: 12pt">
				<span lang="EN-US" style="FONT-SIZE: 9pt; mso-bidi-font-size: 12.0pt">Press RETURN or Enter command to continue<o:p></o:p></span>
		</p>
		<p class="MsoNormal" style="TEXT-INDENT: 18pt; mso-char-indent-count: 2.0; mso-char-indent-size: 12pt">
				<span lang="EN-US" style="FONT-SIZE: 9pt; mso-bidi-font-size: 12.0pt"> <o:p></o:p></span>
		</p>
		<p class="MsoNormal" style="TEXT-INDENT: 9pt; mso-char-indent-count: 1.0; mso-char-indent-size: 12pt">
				<span lang="EN-US" style="FONT-SIZE: 9pt; mso-bidi-font-size: 12.0pt">
						<?XML:NAMESPACE PREFIX = V /?>
						<v:shape id="_x0000_i1030" style="WIDTH: 9pt; HEIGHT: 9pt" o:bullet="t" coordsize="21600,21600" type="#_x0000_t75">
								<v:imagedata src="./book_4.files/image003.gif" o:title="BD14581_">
								</v:imagedata>
						</v:shape>
						<span style="mso-spacerun: yes"> </span>
						<a name="command3">
						</a>插入命令（注意字母大小写）<o:p></o:p></span>
		</p>
		<p class="MsoNormal" style="TEXT-INDENT: 18pt; mso-char-indent-count: 2.0; mso-char-indent-size: 12pt">
				<span lang="EN-US" style="FONT-SIZE: 9pt; mso-bidi-font-size: 12.0pt">i 在光标前插入文本<o:p></o:p></span>
		</p>
		<p class="MsoNormal" style="TEXT-INDENT: 18pt; mso-char-indent-count: 2.0; mso-char-indent-size: 12pt">
				<span lang="EN-US" style="FONT-SIZE: 9pt; mso-bidi-font-size: 12.0pt">I 在此行开始插入文本<span style="mso-spacerun: yes">      </span><o:p></o:p></span>
		</p>
		<p class="MsoNormal" style="TEXT-INDENT: 18pt; mso-char-indent-count: 2.0; mso-char-indent-size: 12pt">
				<span lang="EN-US" style="FONT-SIZE: 9pt; mso-bidi-font-size: 12.0pt">a 在光标后插入文本<o:p></o:p></span>
		</p>
		<p class="MsoNormal" style="TEXT-INDENT: 18pt; mso-char-indent-count: 2.0; mso-char-indent-size: 12pt">
				<span lang="EN-US" style="FONT-SIZE: 9pt; mso-bidi-font-size: 12.0pt">A 在此行未插入文本<o:p></o:p></span>
		</p>
		<p class="MsoNormal" style="TEXT-INDENT: 18pt; mso-char-indent-count: 2.0; mso-char-indent-size: 12pt">
				<span lang="EN-US" style="FONT-SIZE: 9pt; mso-bidi-font-size: 12.0pt">o 在当前行下面加一空行并进入输入方式<o:p></o:p></span>
		</p>
		<p class="MsoNormal" style="TEXT-INDENT: 18pt; mso-char-indent-count: 2.0; mso-char-indent-size: 12pt">
				<span lang="EN-US" style="FONT-SIZE: 9pt; mso-bidi-font-size: 12.0pt">O在当前行上面加一空行并进入输入方式<o:p></o:p></span>
		</p>
		<p class="MsoNormal">
				<span lang="EN-US" style="FONT-SIZE: 9pt; mso-bidi-font-size: 12.0pt">
						<span style="mso-spacerun: yes">    </span>
						<o:p>
						</o:p>
				</span>
		</p>
		<p class="MsoNormal" style="TEXT-INDENT: 9pt; mso-char-indent-count: 1.0; mso-char-indent-size: 12pt">
				<span lang="EN-US" style="FONT-SIZE: 9pt; mso-bidi-font-size: 12.0pt">
						<v:shape id="_x0000_i1034" style="WIDTH: 9pt; HEIGHT: 9pt" o:bullet="t" coordsize="21600,21600" type="#_x0000_t75">
								<v:imagedata src="./book_4.files/image003.gif" o:title="BD14581_">
								</v:imagedata>
						</v:shape>
						<span style="mso-spacerun: yes"> </span>
						<a name="command4">
						</a>删除、复制、移动命令<o:p></o:p></span>
		</p>
		<p class="MsoNormal" style="TEXT-INDENT: 18pt; mso-char-indent-count: 2.0; mso-char-indent-size: 12pt">
				<span lang="EN-US" style="FONT-SIZE: 9pt; mso-bidi-font-size: 12.0pt">x<span style="mso-spacerun: yes">  </span>删除当前字符<o:p></o:p></span>
		</p>
		<p class="MsoNormal" style="TEXT-INDENT: 18pt; mso-char-indent-count: 2.0; mso-char-indent-size: 12pt">
				<span lang="EN-US" style="FONT-SIZE: 9pt; mso-bidi-font-size: 12.0pt">d$ 删除当前行中从光标往后的所有字符<o:p></o:p></span>
		</p>
		<p class="MsoNormal" style="TEXT-INDENT: 18pt; mso-char-indent-count: 2.0; mso-char-indent-size: 12pt">
				<span lang="EN-US" style="FONT-SIZE: 9pt; mso-bidi-font-size: 12.0pt">d0 删除当前行中从光标往前的所有字符<o:p></o:p></span>
		</p>
		<p class="MsoNormal" style="TEXT-INDENT: 18pt; mso-char-indent-count: 2.0; mso-char-indent-size: 12pt">
				<span lang="EN-US" style="FONT-SIZE: 9pt; mso-bidi-font-size: 12.0pt">dd 删除当前行<o:p></o:p></span>
		</p>
		<p class="MsoNormal" style="TEXT-INDENT: 18pt; mso-char-indent-count: 2.0; mso-char-indent-size: 12pt">
				<span lang="EN-US" style="FONT-SIZE: 9pt; mso-bidi-font-size: 12.0pt">ndd 删除光标所在位置之下的n行<o:p></o:p></span>
		</p>
		<p class="MsoNormal" style="TEXT-INDENT: 18pt; mso-char-indent-count: 2.0; mso-char-indent-size: 12pt">
				<span style="FONT-SIZE: 9pt; mso-bidi-font-size: 12.0pt">：<span lang="EN-US" style="BACKGROUND: #d9d9d9; mso-shading: white; mso-pattern: gray-15 auto">n1 ,n2d</span><span lang="EN-US"> 删除n1行到n2行<span style="mso-spacerun: yes">  </span>(在最后一行状态)<o:p></o:p></span></span>
		</p>
		<p class="MsoNormal" style="TEXT-INDENT: 9pt; mso-char-indent-count: 1.0; mso-char-indent-size: 12pt">
				<span lang="EN-US" style="FONT-SIZE: 9pt; mso-bidi-font-size: 12.0pt">
						<span style="mso-spacerun: yes"> </span>
						<span style="mso-spacerun: yes"> </span>yy<span style="mso-spacerun: yes">  </span>将当前行复制到缓冲区<o:p></o:p></span>
		</p>
		<p class="MsoNormal" style="TEXT-INDENT: 18pt; mso-char-indent-count: 2.0; mso-char-indent-size: 9.0pt">
				<span lang="EN-US" style="FONT-SIZE: 9pt; mso-bidi-font-size: 12.0pt">nyy 将光标所在位置之下的n行文本复制到缓冲区<o:p></o:p></span>
		</p>
		<p class="MsoNormal" style="TEXT-INDENT: 18pt; mso-char-indent-count: 2.0; mso-char-indent-size: 9.0pt">
				<span lang="EN-US" style="FONT-SIZE: 9pt; mso-bidi-font-size: 12.0pt">p：将上一次删除或复制的文本复制到光标的下方<span style="mso-spacerun: yes">  </span><o:p></o:p></span>
		</p>
		<p class="MsoNormal" style="TEXT-INDENT: 18pt; mso-char-indent-count: 2.0; mso-char-indent-size: 9.0pt">
				<span lang="EN-US" style="FONT-SIZE: 9pt; mso-bidi-font-size: 12.0pt">P：将上一次删除或复制的文本复制到光标的上方<o:p></o:p></span>
		</p>
		<p class="MsoNormal" style="TEXT-INDENT: 18pt; mso-char-indent-count: 2.0; mso-char-indent-size: 9.0pt">
				<span style="FONT-SIZE: 9pt; mso-bidi-font-size: 12.0pt">说明：移动正文时需先用删除命令将要移动的正文删除，然后使用复制命令<span lang="EN-US"><o:p></o:p></span></span>
		</p>
		<p class="MsoNormal" style="TEXT-INDENT: 9pt; mso-char-indent-count: 1.0; mso-char-indent-size: 12pt">
				<span lang="EN-US" style="FONT-SIZE: 9pt; mso-bidi-font-size: 12.0pt"> <o:p></o:p></span>
		</p>
		<p class="MsoNormal" style="TEXT-INDENT: 9pt; mso-char-indent-count: 1.0; mso-char-indent-size: 12pt">
				<span lang="EN-US" style="FONT-SIZE: 9pt; mso-bidi-font-size: 12.0pt">
						<v:shape id="_x0000_i1035" style="WIDTH: 9pt; HEIGHT: 9pt" o:bullet="t" coordsize="21600,21600" type="#_x0000_t75">
								<v:imagedata src="./book_4.files/image003.gif" o:title="BD14581_">
								</v:imagedata>
						</v:shape>
						<span style="mso-spacerun: yes"> </span>
						<a name="command5">
						</a>光标移动命令<o:p></o:p></span>
		</p>
		<p class="MsoNormal" style="TEXT-INDENT: 18pt; mso-char-indent-count: 2.0; mso-char-indent-size: 12pt; tab-stops: 48.0pt">
				<span style="FONT-SIZE: 9pt; mso-bidi-font-size: 12.0pt">键盘的←↑→↓键 分别是左移<span lang="EN-US">,上移,右移,下移 <o:p></o:p></span></span>
		</p>
		<p class="MsoNormal" style="TEXT-INDENT: 18pt; mso-char-indent-count: 2.0; mso-char-indent-size: 12pt; tab-stops: 42.0pt">
				<span lang="EN-US" style="FONT-SIZE: 9pt; mso-bidi-font-size: 12.0pt">O(数字), $<span style="mso-spacerun: yes">  </span>移至当前行首和行尾<o:p></o:p></span>
		</p>
		<p class="MsoNormal" style="TEXT-INDENT: 18pt; mso-char-indent-count: 2.0; mso-char-indent-size: 12pt">
				<span lang="EN-US" style="FONT-SIZE: 9pt; mso-bidi-font-size: 12.0pt">&lt;shift&gt;+h移动光标至当前窗口的起点<o:p></o:p></span>
		</p>
		<p class="MsoNormal" style="TEXT-INDENT: 18pt; mso-char-indent-count: 2.0; mso-char-indent-size: 12pt; tab-stops: 48.0pt">
				<span lang="EN-US" style="FONT-SIZE: 9pt; mso-bidi-font-size: 12.0pt">&lt;shift&gt;+l移动光标至当前窗口的末尾<o:p></o:p></span>
		</p>
		<p class="MsoNormal" style="TEXT-INDENT: 18pt; mso-char-indent-count: 2.0; mso-char-indent-size: 12pt">
				<span lang="EN-US" style="FONT-SIZE: 9pt; mso-bidi-font-size: 12.0pt">&lt;shift&gt;+g （或G）移动光标至文件的末尾 <o:p></o:p></span>
		</p>
		<p class="MsoNormal" style="TEXT-INDENT: 18pt; mso-char-indent-count: 2.0; mso-char-indent-size: 12pt">
				<span lang="EN-US" style="FONT-SIZE: 9pt; mso-bidi-font-size: 12.0pt">&lt;ctrl&gt;+f前翻一页<o:p></o:p></span>
		</p>
		<p class="MsoNormal" style="TEXT-INDENT: 18pt; mso-char-indent-count: 2.0; mso-char-indent-size: 12pt">
				<span lang="EN-US" style="FONT-SIZE: 9pt; mso-bidi-font-size: 12.0pt">&lt;ctrl&gt;+b后翻一页<o:p></o:p></span>
		</p>
		<p class="MsoNormal" style="TEXT-INDENT: 18pt; mso-char-indent-count: 2.0; mso-char-indent-size: 12pt">
				<span lang="EN-US" style="FONT-SIZE: 9pt; mso-bidi-font-size: 12.0pt">nG 移动光标至第n行<o:p></o:p></span>
		</p>
		<p class="MsoNormal" style="TEXT-INDENT: 18pt; mso-char-indent-count: 2.0; mso-char-indent-size: 12pt">
				<span lang="EN-US" style="FONT-SIZE: 9pt; mso-bidi-font-size: 12.0pt">&lt;ctrl&gt;+g 显示当前行号<o:p></o:p></span>
		</p>
		<p class="MsoNormal" style="TEXT-INDENT: 18pt; mso-char-indent-count: 2.0; mso-char-indent-size: 12pt">
				<span lang="EN-US" style="FONT-SIZE: 9pt; mso-bidi-font-size: 12.0pt">J 将当前行与下一行连接<o:p></o:p></span>
		</p>
		<p class="MsoNormal" style="TEXT-INDENT: 18pt; mso-char-indent-count: 2.0; mso-char-indent-size: 12pt">
				<span lang="EN-US" style="FONT-SIZE: 9pt; mso-bidi-font-size: 12.0pt">u 取消前一个命令<o:p></o:p></span>
		</p>
		<p class="MsoNormal" style="MARGIN-LEFT: 42pt">
				<span lang="EN-US" style="FONT-SIZE: 9pt; mso-bidi-font-size: 12.0pt"> <o:p></o:p></span>
		</p>
		<p class="MsoNormal" style="TEXT-INDENT: 9pt; mso-char-indent-count: 1.0; mso-char-indent-size: 12pt">
				<span lang="EN-US" style="FONT-SIZE: 9pt; mso-bidi-font-size: 12.0pt">
						<v:shape id="_x0000_i1036" style="WIDTH: 9pt; HEIGHT: 9pt" o:bullet="t" coordsize="21600,21600" type="#_x0000_t75">
								<v:imagedata src="./book_4.files/image003.gif" o:title="BD14581_">
								</v:imagedata>
						</v:shape>
						<span style="mso-spacerun: yes"> </span>
						<a name="command6">
						</a>查找字符<o:p></o:p></span>
		</p>
		<p class="MsoNormal" style="TEXT-INDENT: 18pt; mso-char-indent-count: 2.0; mso-char-indent-size: 9.0pt">
				<span lang="EN-US" style="FONT-SIZE: 9pt; mso-bidi-font-size: 12.0pt">/要查找的字符串(回车)：查找光标位置之后的字符串 <o:p></o:p></span>
		</p>
		<p class="MsoNormal" style="TEXT-INDENT: 18pt; mso-char-indent-count: 2.0; mso-char-indent-size: 9.0pt">
				<span lang="EN-US" style="FONT-SIZE: 9pt; mso-bidi-font-size: 12.0pt">?要查找的字符串(回车)：查找光标位置之前的字符串<o:p></o:p></span>
		</p>
		<p class="MsoNormal" style="TEXT-INDENT: 18pt; mso-char-indent-count: 2.0; mso-char-indent-size: 9.0pt">
				<span lang="EN-US" style="FONT-SIZE: 9pt; mso-bidi-font-size: 12.0pt">n<span style="mso-spacerun: yes">  </span>继续向同一方向查找匹配的字符串<o:p></o:p></span>
		</p>
		<p class="MsoNormal" style="TEXT-INDENT: 18pt; mso-char-indent-count: 2.0; mso-char-indent-size: 9.0pt">
				<span lang="EN-US" style="FONT-SIZE: 9pt; mso-bidi-font-size: 12.0pt">N<span style="mso-spacerun: yes">  </span>继续进行反方向查找匹配的字符串<o:p></o:p></span>
		</p>
		<p class="MsoNormal" style="TEXT-INDENT: 18pt; mso-char-indent-count: 2.0; mso-char-indent-size: 9.0pt">
				<span lang="EN-US" style="FONT-SIZE: 9pt; mso-bidi-font-size: 12.0pt">* 在查找的字符串中可匹配任意字符<o:p></o:p></span>
		</p>
		<p class="MsoNormal" style="TEXT-INDENT: 18pt; mso-char-indent-count: 2.0; mso-char-indent-size: 9.0pt">
				<span lang="EN-US" style="FONT-SIZE: 9pt; mso-bidi-font-size: 12.0pt">? 在查找的字符串中可匹配一个字符<o:p></o:p></span>
		</p>
		<p class="MsoNormal">
				<span lang="EN-US" style="FONT-SIZE: 9pt; mso-bidi-font-size: 12.0pt"> <o:p></o:p></span>
		</p>
		<p class="MsoNormal" style="TEXT-INDENT: 9pt; mso-char-indent-count: 1.0; mso-char-indent-size: 9.0pt">
				<span lang="EN-US" style="FONT-SIZE: 9pt; mso-bidi-font-size: 12.0pt">
						<v:shape id="_x0000_i1037" style="WIDTH: 9pt; HEIGHT: 9pt" o:bullet="t" coordsize="21600,21600" type="#_x0000_t75">
								<v:imagedata src="./book_4.files/image003.gif" o:title="BD14581_">
								</v:imagedata>
						</v:shape>
						<span style="mso-spacerun: yes"> </span>
						<a name="command7">
						</a>修改字符<o:p></o:p></span>
		</p>
		<p class="MsoNormal" style="TEXT-INDENT: 18pt; mso-char-indent-count: 2.0; mso-char-indent-size: 9.0pt">
				<span lang="EN-US" style="FONT-SIZE: 9pt; mso-bidi-font-size: 12.0pt">r 只替换光标位置上的一个字符<o:p></o:p></span>
		</p>
		<p class="MsoNormal" style="TEXT-INDENT: 18pt; mso-char-indent-count: 2.0; mso-char-indent-size: 9.0pt">
				<span lang="EN-US" style="FONT-SIZE: 9pt; mso-bidi-font-size: 12.0pt">R 用重写的方法替换原来的字符串，结束替换按&lt;Esc&gt;键<o:p></o:p></span>
		</p>
		<p class="MsoNormal">
				<span lang="EN-US" style="FONT-SIZE: 9pt; mso-bidi-font-size: 12.0pt">:[n1,n2]s/旧字符串/新字符串/g&lt;Enter&gt;<span style="mso-spacerun: yes">  </span>用新文本替换n1～n2行内的所有旧字符串, n1,n2缺省时只修改当前行<o:p></o:p></span>
		</p>
		<p class="MsoNormal" style="TEXT-INDENT: 18pt; mso-char-indent-count: 2.0; mso-char-indent-size: 9.0pt">
				<span lang="EN-US" style="FONT-SIZE: 9pt; mso-bidi-font-size: 12.0pt">:g/旧文本/s//新文本/g&lt;Enter&gt;<span style="mso-spacerun: yes">  </span>用新文本替换缓冲区内找到的所有旧文本<o:p></o:p></span>
		</p>
		<p class="MsoNormal" style="TEXT-INDENT: 18pt; mso-char-indent-count: 2.0; mso-char-indent-size: 9.0pt">
				<span lang="EN-US" style="FONT-SIZE: 9pt; mso-bidi-font-size: 12.0pt">. 重复上一次修改<o:p></o:p></span>
		</p>
		<p class="MsoNormal" style="TEXT-INDENT: 18pt; mso-char-indent-count: 2.0; mso-char-indent-size: 9.0pt">
				<span lang="EN-US" style="FONT-SIZE: 9pt; mso-bidi-font-size: 12.0pt">u 取消上一次修改<o:p></o:p></span>
		</p>
		<p class="MsoNormal" style="TEXT-INDENT: 18pt; mso-char-indent-count: 2.0; mso-char-indent-size: 9.0pt">
				<span lang="EN-US" style="FONT-SIZE: 9pt; mso-bidi-font-size: 12.0pt">U 将当前行恢复到修改前的状态<o:p></o:p></span>
		</p>
		<p class="MsoNormal">
				<span lang="EN-US" style="FONT-SIZE: 9pt; mso-bidi-font-size: 12.0pt"> <o:p></o:p></span>
		</p>
		<p class="MsoNormal" style="TEXT-INDENT: 9pt; mso-char-indent-count: 1.0; mso-char-indent-size: 9.0pt">
				<span lang="EN-US" style="FONT-SIZE: 9pt; mso-bidi-font-size: 12.0pt">
						<v:shape id="_x0000_i1039" style="WIDTH: 9pt; HEIGHT: 9pt" o:bullet="t" coordsize="21600,21600" type="#_x0000_t75">
								<v:imagedata src="./book_4.files/image003.gif" o:title="BD14581_">
								</v:imagedata>
						</v:shape>
						<span style="mso-spacerun: yes"> </span>
						<a name="command8">
						</a>常用功能选项的设置<o:p></o:p></span>
		</p>
		<p class="MsoNormal" style="TEXT-INDENT: 18pt; mso-char-indent-count: 2.0; mso-char-indent-size: 9.0pt">
				<span style="FONT-SIZE: 9pt; mso-bidi-font-size: 12.0pt">功能选项将改变<span lang="EN-US">vi的显示环境，用户可在文件$HOME/.exrc中设置自己的选项，如没有此文件，则使用缺省设置。set命令在vi的最后一行命令状态使用。<o:p></o:p></span></span>
		</p>
		<p class="MsoNormal" style="TEXT-INDENT: 18pt; mso-char-indent-count: 2.0; mso-char-indent-size: 9.0pt">
				<span lang="EN-US" style="FONT-SIZE: 9pt; mso-bidi-font-size: 12.0pt">set 显示与缺省不同的设置<o:p></o:p></span>
		</p>
		<p class="MsoNormal" style="TEXT-INDENT: 18pt; mso-char-indent-count: 2.0; mso-char-indent-size: 9.0pt">
				<span lang="EN-US" style="FONT-SIZE: 9pt; mso-bidi-font-size: 12.0pt">set all 显示所有设置<o:p></o:p></span>
		</p>
		<p class="MsoNormal" style="TEXT-INDENT: 18pt; mso-char-indent-count: 2.0; mso-char-indent-size: 9.0pt">
				<span lang="EN-US" style="FONT-SIZE: 9pt; mso-bidi-font-size: 12.0pt">set ai/noai 自动/不自动缩进<o:p></o:p></span>
		</p>
		<p class="MsoNormal" style="TEXT-INDENT: 18pt; mso-char-indent-count: 2.0; mso-char-indent-size: 9.0pt">
				<span lang="EN-US" style="FONT-SIZE: 9pt; mso-bidi-font-size: 12.0pt">set nu/nonu 显示/不显示行号<o:p></o:p></span>
		</p>
		<p class="MsoNormal" style="TEXT-INDENT: 18pt; mso-char-indent-count: 2.0; mso-char-indent-size: 9.0pt">
				<span lang="EN-US" style="FONT-SIZE: 9pt; mso-bidi-font-size: 12.0pt">set list/nolist 显示/不显示不可打印字符<o:p></o:p></span>
		</p>
		<p class="MsoNormal" style="TEXT-INDENT: 18pt; mso-char-indent-count: 2.0; mso-char-indent-size: 9.0pt">
				<span lang="EN-US" style="FONT-SIZE: 9pt; mso-bidi-font-size: 12.0pt">set showmode/noshowmode显示/不显示当前操作模式<o:p></o:p></span>
		</p>
		<p class="MsoNormal" style="TEXT-INDENT: 18pt; mso-char-indent-count: 2.0; mso-char-indent-size: 9.0pt">
				<span lang="EN-US" style="FONT-SIZE: 9pt; mso-bidi-font-size: 12.0pt">set ts=4 设置&lt;Tab&gt;键为4个空格<o:p></o:p></span>
		</p>
		<p class="MsoNormal" style="TEXT-INDENT: 18pt; mso-char-indent-count: 2.0; mso-char-indent-size: 9.0pt">
				<span lang="EN-US" style="FONT-SIZE: 9pt; mso-bidi-font-size: 12.0pt">set ic/noic 忽略/不忽略大小写<o:p></o:p></span>
		</p>
		<p class="MsoNormal">
				<span lang="EN-US" style="FONT-SIZE: 9pt; mso-bidi-font-size: 12.0pt"> <o:p></o:p></span>
		</p>
		<p class="MsoNormal" style="TEXT-INDENT: 9pt; mso-char-indent-count: 1.0; mso-char-indent-size: 9.0pt">
				<span lang="EN-US" style="FONT-SIZE: 9pt; mso-bidi-font-size: 12.0pt">
						<v:shape id="_x0000_i1040" style="WIDTH: 9pt; HEIGHT: 9pt" o:bullet="t" coordsize="21600,21600" type="#_x0000_t75">
								<v:imagedata src="./book_4.files/image003.gif" o:title="BD14581_">
								</v:imagedata>
						</v:shape>
						<span style="mso-spacerun: yes"> </span>
						<a name="command9">
						</a>文件的读写和退出<o:p></o:p></span>
		</p>
		<p class="MsoNormal" style="TEXT-INDENT: 18pt; mso-char-indent-count: 2.0; mso-char-indent-size: 9.0pt">
				<span lang="EN-US" style="FONT-SIZE: 9pt; mso-bidi-font-size: 12.0pt">vi中文件的读写命令均在最后一行状态命令实现<o:p></o:p></span>
		</p>
		<p class="MsoNormal" style="TEXT-INDENT: 18pt; mso-char-indent-count: 2.0; mso-char-indent-size: 9.0pt">
				<span lang="EN-US" style="FONT-SIZE: 9pt; mso-bidi-font-size: 12.0pt"> <o:p></o:p></span>
		</p>
		<p class="MsoNormal" style="TEXT-INDENT: 18pt; mso-char-indent-count: 2.0; mso-char-indent-size: 9.0pt">
				<span lang="EN-US" style="FONT-SIZE: 9pt; mso-bidi-font-size: 12.0pt">w<span style="mso-spacerun: yes">  </span>将缓冲区内容写入原文件<o:p></o:p></span>
		</p>
		<p class="MsoNormal" style="TEXT-INDENT: 18pt; mso-char-indent-count: 2.0; mso-char-indent-size: 9.0pt">
				<span lang="EN-US" style="FONT-SIZE: 9pt; mso-bidi-font-size: 12.0pt">w file2<span style="mso-spacerun: yes">  </span>将缓冲区内容写入文件file2<o:p></o:p></span>
		</p>
		<p class="MsoNormal" style="TEXT-INDENT: 18pt; mso-char-indent-count: 2.0; mso-char-indent-size: 9.0pt">
				<span lang="EN-US" style="FONT-SIZE: 9pt; mso-bidi-font-size: 12.0pt">w &gt;&gt;file2<span style="mso-spacerun: yes">  </span>将缓冲区内容附加到文件file2的后面<o:p></o:p></span>
		</p>
		<p class="MsoNormal" style="TEXT-INDENT: 18pt; mso-char-indent-count: 2.0; mso-char-indent-size: 9.0pt">
				<span lang="EN-US" style="FONT-SIZE: 9pt; mso-bidi-font-size: 12.0pt">q<span style="mso-spacerun: yes">  </span>退出vi<o:p></o:p></span>
		</p>
		<p class="MsoNormal" style="TEXT-INDENT: 18pt; mso-char-indent-count: 2.0; mso-char-indent-size: 9.0pt">
				<span lang="EN-US" style="FONT-SIZE: 9pt; mso-bidi-font-size: 12.0pt">q! 强行退出vi,不改写文件<o:p></o:p></span>
		</p>
		<p class="MsoNormal" style="TEXT-INDENT: 18pt; mso-char-indent-count: 2.0; mso-char-indent-size: 9.0pt">
				<span lang="EN-US" style="FONT-SIZE: 9pt; mso-bidi-font-size: 12.0pt">r file2 将file2中的内容读入到缓冲区当前行后<o:p></o:p></span>
		</p>
		<p class="MsoNormal" style="TEXT-INDENT: 18pt; mso-char-indent-count: 2.0; mso-char-indent-size: 9.0pt">
				<span lang="EN-US" style="FONT-SIZE: 9pt; mso-bidi-font-size: 12.0pt">wq<span style="mso-spacerun: yes">  </span>存盘退出<span style="mso-spacerun: yes">  </span><o:p></o:p></span>
		</p>
		<p class="MsoNormal" style="TEXT-INDENT: 18pt; mso-char-indent-count: 2.0; mso-char-indent-size: 9.0pt">
				<span lang="EN-US" style="FONT-SIZE: 9pt; mso-bidi-font-size: 12.0pt">!shell<span style="mso-spacerun: yes">  </span>执行shell命令<o:p></o:p></span>
		</p>
		<p class="MsoNormal" style="TEXT-INDENT: 18pt; mso-char-indent-count: 2.0; mso-char-indent-size: 9.0pt">
				<span lang="EN-US" style="FONT-SIZE: 9pt; mso-bidi-font-size: 12.0pt">! 退出shell命令<o:p></o:p></span> </p>
		<br />
		<div class="postText">VI常用命令 <br /><br />VI命令可以说是Unix/Linux世界里最常用的编辑文件的命令了，但是因为它的命令集众多，很多人都不习惯使用它，其实您只需要掌握基本命令，然后加以灵活运用，就会发现它的优势，并会逐渐喜欢使用这种方法。本文旨在介绍VI的一些最常用命令和高级应用技巧。 <br /><br />一、基本命令介绍 <br /><br />---- 1．光标命令 <br /><br />k、j、h、l——上、下、左、右光标移动命令。虽然您可以在Linux中使用键盘右边的4个光标键，但是记住这4个命令还是非常有用的。这4个键正是右手在键盘上放置的基本位置。 <br />nG——跳转命令。n为行数，该命令立即使光标跳到指定行。 <br />Ctrl+G——光标所在位置的行数和列数报告。 <br />w、b——使光标向前或向后跳过一个单词。 <br />---- 2．编辑命令 <br />i、a、r——在光标的前、后以及所在处插入字符命令(i=insert、a=append、r=replace)。 <br />cw、dw——改变(置换)/删除光标所在处的单词的命令 (c=change、d=delete)。 <br />x、d$、dd——删除一个字符、删除光标所在处到行尾的所有字符以及删除整行的命令。 <br />---- 3．查找命令 <br />---- /string、?string——从光标所在处向后或向前查找相应的字符串的命令。 <br />---- 4．拷贝复制命令 <br />---- yy、p——拷贝一行到剪贴板或取出剪贴板中内容的命令。 <br /><br />二、常见问题及应用技巧 <br /><br />---- 1．在一个新文件中读/etc/passwd中的内容，取出用户名部分。 <br />---- vi file <br />---- :r /etc/passwd 在打开的文件file中光标所在处读入/etc/passwd <br />---- :%s/:.*//g 删除/etc/passwd中用户名后面的从冒号开始直到行尾的所有部分。 <br />---- 您也可以在指定的行号后读入文件内容，例如使用命令“:3r /etc/passwd”从新文件的第3行开始读入 /etc/passwd的所有内容。 <br />---- 我们还可以使用以下方法删掉文件中所有的空行及以#开始的注释行。 <br />---- #cat squid.conf.default | grep -v '^$' | grep -v '^#' <br /><br />---- 2．在打开一个文件编辑后才知道登录的用户对该文件没有写的权限，不能存盘，需要将所做修改存入临时文件。 <br />---- vi file <br />---- :w /tmp/1 保存所做的所有修改，也可以将其中的某一部分修改保存到临时文件，例如仅仅把第20～59行之间的内容存盘成文件/tmp/1，我们可以键入如下命令。 <br />---- vi file <br />---- :20,59w /tmp/1 <br /><br />---- 3．用VI编辑一个文件，但需要删除大段的内容。 <br />---- 首先利用编辑命令“vi file”打开文件，然后将光标移到需要删除的行处按Ctrl+G显示行号，再到结尾处再按Ctrl+G，显示文件结尾的行号。 <br />---- :23,1045d 假定2次得到的行号为23和1045，则把这期间的内容全删除，也可以在要删除的开始行和结束行中用ma、mb命令标记，然后利用“:'a,'bd”命令删除。 <br /><br />---- 4．在整个文件的各行或某几行的行首或行尾加一些字符串。 <br />---- vi file <br />---- :3,$s/^/some string / 在文件的第一行至最后一行的行首插入“some string”。 <br />---- :%s/$/some string/g 在整个文件每一行的行尾添加“some string”。 <br />---- :%s/string1/string2/g 在整个文件中替换“string1”成“string2”。 <br />---- :3,7s/string1/string2/ 仅替换文件中的第3行到第7行中的“string1”成“string2”。 <br />---- 注意: 其中s为substitute，%表示所有行，g表示global。 <br /><br />---- 5．同时编辑2个文件，拷贝一个文件中的文本并粘贴到另一个文件中。 <br />---- vi file1 file2 <br />---- yy 在文件1的光标处拷贝所在行 <br />---- :n 切换到文件2 (n=next) <br />---- p 在文件2的光标所在处粘贴所拷贝的行 <br />---- :n 切换回文件1 <br /><br />---- 6．替换文件中的路径。 <br />---- 使用命令“:%s#/usr/bin#/bin#g”可以把文件中所有路径/usr/bin换成/bin。也可以使用命令“:%s//usr/bin//bin/g”实现，其中“”是转义字符，表明其后的“/”字符是具有实际意义的字符，不是分隔符。</div>
<img src ="http://www.cnitblog.com/charester/aggbug/20939.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cnitblog.com/charester/" target="_blank">天空</a> 2006-12-21 20:42 <a href="http://www.cnitblog.com/charester/archive/2006/12/21/20939.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>VI 学习（一）VI FAQ </title><link>http://www.cnitblog.com/charester/archive/2006/12/21/20938.html</link><dc:creator>天空</dc:creator><author>天空</author><pubDate>Thu, 21 Dec 2006 12:36:00 GMT</pubDate><guid>http://www.cnitblog.com/charester/archive/2006/12/21/20938.html</guid><wfw:comment>http://www.cnitblog.com/charester/comments/20938.html</wfw:comment><comments>http://www.cnitblog.com/charester/archive/2006/12/21/20938.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cnitblog.com/charester/comments/commentRss/20938.html</wfw:commentRss><trackback:ping>http://www.cnitblog.com/charester/services/trackbacks/20938.html</trackback:ping><description><![CDATA[
		<p>
				<font face="宋体">0.0 - 引言 -- 我怎样用这个FAQ<br /><br />这个文档分为了几个部分.首先,第0节和第1节介绍了什么是vi;第2节则收录了很多新学者的问题,一些对vi没有很多经验的人也经常问这些问题.这里面包括诸如“命令模式和插入模式之间的区别”,以及“我怎样拷贝和粘贴”之类的问题.第3节是面向vi的中级用户的,它从问题“我如何查找和替换”开始,逐步深入,直到对vi里面的宏（Macro）的用法讨论为止.第3节还包括了一个vi的快速参考,有一个规范的vi命令列表.再下面,是一个有关“:set”命令的列表,包含了所有能定制vi环境的变量,这些变量也可以在.exrc文件中定义.<br /><br />我们已经在一个运行SunOS和UCB版本vi的机器上验证了快速参考.除了SunOS带的vi外,每个命令都可以在系统V和UCB版本vi运行,但是我个人并没有验证这一点.<br /><br />除非我们在文档中指明,缺省我们假定你处在命令模式下.<br /><br />我们还尝试保留尽可能多的术语,因为在原始的vi文档中使用了这些术语,尽管我可能忘了它的本来含义.<br /><br />0.1 - 索引<br /><br />第一个文件：<br /><br />0.0 - 引言 -- 我怎样用这个FAQ？<br />0.1 - 索引<br />0.2 - 我可以散发这个FAQ吗？<br />0.3 - 你能为这个FAQ做什么？<br /><br />1.0 - 什么是vi?<br />1.1 - 关于vi有什么重大的交易吗? 为什么大家都用它? 更进一步说,为什么我要用它?<br />1.2 - 噢! 这听起来不错! 有没有理由不用vi?<br />1.3 - vi能在多少不同的操作系统下面运行?<br />1.4 - 好吧, 你说服了我. 我决定开始使用vi. 我该从哪儿开始?<br />1.5 - vi有其他一些可用的变种吗?<br /><br />2.0 - vi入门<br />2.1 - 有什么游戏帮助我们学习vi吗?<br />2.2 - 命令模式和插入模式有什么区别?<br />2.3 - 等等,我的键盘没有&lt;Esc&gt;键,我该怎么办?<br />2.4 - 那些~s是什么东西?<br />2.5 - 我无法习惯用 hjkl, 你有什么建议吗?<br />2.6 - 我如何才能不存盘就退出?<br />2.7 - 我怎样插入一个文件?<br />2.8 - 我怎样查找文本?<br />2.9 - 我怎样搜索一个控制序列?<br />2.10 - 我怎样重新格式化文本?<br />2.11 - 我怎样复制文本?<br />2.12 - 啊! 我刚才敲了一个dG,然后我的论文就没有了! 我该怎么办?<br />(或者,我刚才犯了个错误,我该怎么办?)<br />2.13 - 我正在写我的论文,被告知我必须将每一节都放在不同的文件里,我该怎么办?<br />2.14 - 所有的:命令都是怎样处理的?<br /><br />3.0 - 怎样查找和替换?<br />3.1 - 我怎样在vi中运行一个程序?<br />3.2 - 啊! 我正在写我的论文, 系统崩溃了! 怎么办?<br />3.3 - 有没有使vi对程序员更友好的窍门?<br />3.4 - 宏 -- 我怎样写宏?<br />3.5 - 我怎样将一个功能键定义成一个宏?<br />3.6 - 有没有办法缩写文本?<br />3.7 - 我怎样在当前文档中做拼写检查?<br />3.8 - 我手头有一个硬拷贝的终端, 我还能用vi吗?<br />3.9 - 好了,是不是处在开放模式下的原因呀?! 但是我现在没有用硬拷贝终端,它还是在<br />开放模式呀?<br /><br />第二个文件:<br /><br />4.0 - vi档案的在线帮助在哪儿?<br />5.0 - 好玩的vi诀窍,无聊的宏<br />5.1 - 好玩的vi诀窍<br />5.2 - 好玩的宏<br />6.0 - 依字母顺序的vi快速参考<br />6.1 - 命令模式的输入选项(:命令)<br />6.2 - 设置选项(set)<br />7.0 - 建立 .exrc文件<br />7.1 - .exrc文件的样本<br />8.0 - vi的漏洞<br />9.0 - 术语表<br />10.0 - 关于vi的参考书目<br /><br />0.2 - 我可以散发这个FAQ吗？<br /><br />可以!只要你没有对它做任何修改,或者用它来赚钱.<br /><br />0.3 - 你能为这个FAQ做什么？<br />首先, 把你发现的错误告诉我. 如果你有什么建议我们也很欢迎. 你认为还不清楚的地方告诉我们,我们同样欢迎.<br />还有, 使用vi! (Spread the word) 我很抱歉我无法将所有对这个FAQ有贡献的人都列出来, 因为许许多多的人都给过我建议和帮助,如果我将他们都列出来的话,那么恐怕这张贡献者的清单将和这个文档本身一样长了.<br /><br />1.0 - 什么是vi?<br />vi是个可视化的编辑器(vi就意味着可视化--VIsual). 那么,什么是可视化的编辑器呢？<br />(相对于非可视化的编辑器来说）?可视化的编辑器就是可以让你在编辑文本的时候看到它们.<br />今天,这听起来似乎非常普通,反之,非可视化的编辑器似乎很奇怪. 非可视化的编辑器的例子可以举出不少:如ed, sed和edlin(直到相当近的一段时间内,它是DOS自带的最后一个编辑器)等.<br />vi是威廉.侨伊写的,作为BSD UNIX的一部分. 后来AT&amp;T也开始用vi, 于是标准UNIX也开始用vi了.<br /><br />1.1 - 关于vi有什么重大的交易吗? 为什么大家都用它? 更进一步说,为什么我要用它?<br />vi是UNIX下面的缺省编辑器, 因此几乎近来所有的UNIX都捆绑了vi(近来是指1984年左右).<br />这意味着无论何时你跨平台使用某种UNIX,你都知道在你指尖下面有一个强力的编辑器.为什么不是别的呢? vi是个强大的编辑器.同样,一旦你了解了vi,你就能很快的编辑你的文件,因为它非常能节省你的敲键次数. 由于它在插入和命令两种情况下使用不同的模式,它比大多数的不基于这种模式的编辑器要快. 而且,vi非常小(我机器上面的版本只有200K).还有,vi几乎能做任何事,只要你知道如何使它做你想做的事.<br /><br />1.2 - 噢! 这听起来不错! 有没有理由不用vi?<br />有. 有一个非常好的理由: vi稍微有些难学, 如果你开始学的话,vi又慢又让人痛苦,当然,一旦你学会了, vi就快多了. 但是学习的过程很慢. 有人曾经问我, 如果vi是个比较易学的编辑器, 它是否直观(intuitive)呢? 我一般这样回答:"是的,我们有些人是这样认为.但是大多数人认为我们疯了."<br /><br />1.3 - vi能在多少不同的操作系统下面运行?<br />UNIX. 就是它. 尽管如此,还是有很多vi的变种运行在不同的操作系统上. 我就在以下一些操作系统上用过vi: UNIX, DOS, OS/2, MAC SYSTEM 7.(后面有一个有关细节的列表)<br /><br />1.4 - 好吧, 你说服了我. 我决定开始使用vi. 我该从哪儿开始?<br />好吧, 狡猾的家伙. 关于vi有很多很好的书:大多数讲UNIX的书至少有一章给了vi,而且有不少是专门讲vi的书.我没有什么偏爱. 所以你最好是问问你们那儿的vi高手们他们是从哪儿学来的. 还有,到处试. 用vi打开一个不重要的文档(你的论文不象是个学vi的好实验品),然后再到处试. 我无法想象有人学习vi却不花相当多的时间去到处试试. 记住:如果你有些地方不明白了, 只要敲两次&lt;Esc&gt;键,你就又回到命令模式下了.我要提到的一点是,我想在这里提比较合适,就是如果要成为系统管理员或者其他对UNIX配置做什么修改的话,最好是学学ed或者ex,因为有些版本的UNIX没有把vi放在根分区里面,这样你就可能无计可施了. ed是个不错的选择.<br /><br />1.5 - vi有其他一些可用的变种吗?<br />只能列出一部分:STvi (STevie), elvis, vile, vim, 和nvi, xvi.<br />elvis适用于:Amiga, DOS, OS/2, Unix, VMS, Atari.<br />STevie适用于: Atari ST, DOS, Unix, Mac System 7.<br />Mac System 7可以在很多info-mac的镜象站点获取,在/info-mac/text下.<br />(例如ftp.hawaii.edu)<br />nvi是将和BSD 4.4捆绑在一起的vi.<br />vim适用于: Amiga, DOS, Mac System 7, Unix.<br />Amiga, DOS,和源码可以在以下站点换取:ftp.fu-berlin.de /misc/editors/vim<br />Mac System 7可以在很多info-mac的镜象站点获取,在/info-mac/text下.<br />(例如ftp.hawaii.edu)<br />vile适用于: DOS, OS/2, Unix, VMS.<br />xvi适用于: DOS, Unix.<br />vi的变种之间很有很多差异.很多都改进了vi,大多数都可以使用在这个文档<br />种列出的命令,但是有一些不同的地方.更进一步的细节,你可以参考这些变种<br />附带的相应的文档.<br /><br />2.0 - vi入门<br />对vi的初学者来说,有些基本的提示.第一,任何时候,手头都要有一份命令摘要.我们将在后面给出一个快速参考/命令摘要. 第二, 找一本vi方面的比较好的书.这个文档不是学vi的最佳途径(最起码现在还不是),我不敢保证这个文档能教会一个对vi一无所知的人, 而很多书已经做到了这一点. 但是,我们这里还是给出了不少提示. 对选择书籍来说,有一个标准的原则:买之前一定要仔细阅读. 要了解这本书对你是否有意义.确信它能在你练习vi的时候有用. 和其他的书做个比较 -- 不管怎样,vi可能让你感到非常莫名其妙, 而且你要确信这么一点:是书让你糊涂,而不是<br />你低估了学vi的难度.<br />还有, 找一些诸如"学vi"(vilearn),"vi向导"(vitutor)之类的软件来帮助你掌握<br />vi的基本知识.<br /><br />2.1 - 有什么游戏帮助我们学习vi吗?<br />这似乎很无聊, 但是事实上UNIX系统里面有不少游戏可以帮助你学习使用vi.这些帮助主要是一些基本知识. 虽然我还不知道有哪个游戏可以帮你学习vi的所有命令, 但我确实知道有一些可以帮助你学习使用 hjkl来移动光标. NetHack,一个类Rogue的游戏,就对这非常有帮助. 而且它是一个很大的游戏,能玩很长一段时间. 我没有贬低其他游戏的意思,这些游戏是: rogue, moria, omega, worm, snake.<br /><br />2.2 - 命令模式和插入模式有什么区别?<br />vi将命令模式和插入模式区分开来,这经常被认为是vi的一个大问题,但往往这也被认为是vi的优势所在. 理解其中的区别是掌握vi的关键.vi启动时,开始处于命令模式;在这种模式下,我们可以在文件中到处移动,改变文本的某个特定区域, 剪切, 复制和粘贴文本,还有更多. 插入模式是指用户可以真正插入文本.换句话说,命令模式是用来在文件中移动,而插入模式是用来在文件中键入文本.有些命令,例如: a, i, c, C, O, o和其他一些可以从命令模式切换到插入模式.&lt;Esc&gt;键或者^C(CRTL+C)可以脱离插入模式而返回到命令模式.你要适应这种差别. 它使得vi区别于其他的编辑器. 它也使你能在你的手不离开标准键盘做很多事情.<br /><br />2.3 - 等等,我的键盘没有&lt;Esc&gt;键,我该怎么办?<br />试试敲 ^[(CTRL+[). 如果你的键盘有一个&lt;Meta&gt;键,再试试它.如果还不行,再试试^3.<br /><br />2.4 - 那些~s是什么东西?<br />它们仅仅是用来让你知道你的文档末尾在哪儿.实际上它们并不在你的文档里面,所以你用不着担心它们.<br /><br />2.5 - 我无法习惯用 hjkl, 你有什么建议吗?<br />首先,如果你的终端设置正确而且你连接的也没有问题的话,你可以使用箭头键.但是,如果你认为你要经常使用vi,那么最好是习惯使用 hjkl,因为它们敲起来更快. 而且,有时候连接出问题了,使得ESC序列都可能丢失了.(这样你可能就无法使用箭头键了--译注)<br /><br />2.6 - 我如何才能不存盘就退出?<br />:q!可以做到这一点. 如果vi看起来冻住了,确信你没有错敲了个 ^S. 敲^Q可以解开^S.<br /><br />2.7 - 我怎样插入一个文件?<br />:r &lt;文件名&gt;<br />例如,要插入文件/etc/motd, 可以敲 :r /etc/motd.<br />这将把文件插入到光标处.如果你在r前面指定了一个数字,那么这条命令将把文件插入到那个位置.<br /><br />2.8 - 我怎样查找文本?<br />/&lt;文本&gt;将向前查找, ?&lt;文本&gt;将向后查找. ??或者//将重复上次查找. 在UNIX下,这已经是个可爱的标准用法了. 而且, 在vi中, n将查找文本下一次的出现位置. N重复上次查找,不过逆转了查找的方向. 在查找中可以使用规范式.<br /><br />2.9 - 我怎样搜索一个控制序列?<br />/^V^&lt;序列&gt;<br />^V会告诉vi照字面理解下一个字符,不要把它看作是一条命令.<br /><br />2.10 - 我怎样重新格式化文本?<br />如果你的计算机有一个名叫fmt的程序, 你要做的仅仅是在命令模式下面敲!}fmt(记住,不要在前面加icon_smile.gif. 这可以重新格式化你的文件,从光标所在的位置一直到当前段落的结尾.如果你的机器里面没有fmt这个程序, 你就得去找个类似的软件了(我记得在公共域里面有不少这样的程序,但是我对此了解不多)<br /><br />2.11 - 我怎样复制文本?<br />这有点复杂.把这节拿出来,多看几遍;还有,一定要多做实验.<br />"&lt;字母&gt;yy可以把一行文本拷贝到寄存器中(这里的寄存器是vi的术语,指可以存放剪切和拷贝下来的东西的地方), &lt;字母&gt;里面的字母必须是a到z之间的一个. "&lt;字母&gt;dd可以把一行剪切下来放到寄存器里面. 你可以在yy或者dd前面用数字指明要拷贝或者剪切的行数.如果&lt;字母&gt;中的字母是大写的话,意味着把文本插入到寄存器中已有的文本之前."&lt;字母&gt;p把文本插入到光标之后,"&lt;字母&gt;P把文本插入到光标之前.如果寄存器中含有某一行的开头或结尾,这一行将会被放到另一合适的行上. Y是yy的快捷方式. 还有, y$, yH,yM,等等,都是可以用的.d命令也是一样的.如果要快速的剪切和粘贴, 你就无须指定寄存器了.如果这样的话,你就不能往寄存器里面添加文本了.而且只要有一个删除命令的话,寄存器中的东西就没有了(包括x命令).<br />举例来说,如果要移动上一段的话,你可以把光标移到段落的开头,敲"a13dd,再把光标移到你想要放文本的地方,敲"ap,就可以把那段文本放到光标所在的行后面.现在,大概你想要剪切和粘贴文本到不是行末尾的区域去.我们来看如何做到这一点:我们可以使用 m&lt;字母&gt; 命令来标记一个区域,这个字母可以和剪切/粘贴寄存器的字母相同,因为它们是保存在内存中的不同位置. 然后,敲"&lt;寄存器&gt;`&lt;字母&gt;[yy或者dd], 这里的寄存器就是要保存文本的那个寄存器,&lt;字母&gt;是用来标记的,yy和dd是你的操作.<br /><br />2.12 - 啊! 我刚才敲了一个dG,然后我的论文就没有了! 我该怎么办?<br />(或者,我刚才犯了个错误,我该怎么办?)u可以撤消你刚才的操作.U可以撤消你对当前行的修改(当然,一行对于一篇论文来说当然很不够了). :e!可以不保存修改而重新把你的文件调进来. 还有,你删除的文本都保存在从0到9编号的寄存器里.所以,"&lt;n&gt;p就可以把上第n次的删除文本粘贴出来.你可以按如下的方法迅速地查看所有删除的文本. 先试一个,不对的话,敲u,再试下一个.(为加速这个过程,这时vi中的.命令和通常的用法不一样了.它不是重复上次操作,而是试下一个寄存器,这样<br />你要做的无非就是: "1p u . u .,直到你撤消了你想撤消的删除操作)<br /><br />2.13 - 我正在写我的论文,被告知我必须将每一节都放在不同的文件里,我该怎么办?:[m],[n]w &lt;文件名&gt;可以将从第m行到第n行之间的文本保存到&lt;文件名&gt;所指定的文件中.这种行序号方法几乎在所有的:命令下都可以使用. 如果你用命令:[m],[n] w &gt;&gt;&lt;文件名&gt;,这些文本将添加到文件的后面.<br /><br />2.14 - 所有的:命令都是怎样处理的?<br />:后面的命令都是从ex编辑器里面过来的. 这就给vi加入了很多灵活性,也使vi功能更强大. 例如, 有很多的方法可以用来查找和替换,它们有很多的类似地方(事实上,它们在某种意义上说都是一样的)<br /><br /><br />3.0 - 怎样查找和替换?<br />有很多方法. 最简单的是:<br />:s/old/new/g, 但是,这仅对当前行起作用..., 所以,我们用<br />:%s/old/new/g, 更一般的,我们还可以用<br />:[范围]s/old/new/[cg],这里,[范围]是任意的行范围,包括行号,$(文件末尾),.(当前行),%(当前文件),或者两个行号之间加个破折号(或者可以这样: .,+5,这表示下面5行).[cgi]是c,g,i中间的一个或者什么也没有.c告诉vi每次替换的时候要给提示,g是说对所有一行中出现的地方都做替换.i则是指在查找时不区分大小写.如果最后一个斜杠(/)后面没有东西的话,那么vi只替换在行中第一次匹配的地方.<br />我比较喜欢这样做:<br />:g/foobar/s/bar/baz/g, 这个命令首先搜寻foobar,然后把它变成foobaz. 它没有改变jailbars, 而其他的一些命令可能会改变jailbars. 这是我的方法,但是可能比较难记.<br />当然,你还可以在查找的的时候使用正规式,以及在替换文本的时候使用其他一些命令.如果你在正规式里用\(和\)来剥离一个序列的话,你会发现你可以做很多好玩的事情.</font>
		</p>
		<p>
				<font face="宋体,verdana, arial, helvetica">例如:<br />:g/\(foo\)\(bar\)/s/\2/\1baz/g 将foobar替换成foobaz<br />还有一些特殊的序列:<br />&amp; 所有查找时匹配到的东西<br />\[1-9] 1到9号用\(和\)括起来的东西<br />\u 下一个字符将被变成大写.<br />\U 以后的字符都变成大写,直到遇到\e或\E<br />\l 下一个字符将被变成小写.<br />\L 以后的字符都变成大写,直到遇到\e或\E<br />\[Ee] 更改大小写的选择区域的终点<br /><br />3.1 - 我怎样在vi中运行一个程序?<br />:!命令 可以在vi中运行程序. :sh会启动一个交互式的外壳(SHELL).在这个外壳<br />里面, 如果你愿意,你还可以再次运行vi. 当你在编辑Makefiles和配置文件来编译<br />某个程序的时候,这可能比较有用. 这比:e优越之处在于它无须保存文件,而且如果<br />你退出外壳的时候,vi还回到原来的地方.(当然,我还是建议你先保存一下文件)<br /><br />3.2 - 啊! 我正在写我的论文, 系统崩溃了! 怎么办?<br />不要怕! 你会收到一封电子邮件,里面就是你的论文.敲入vi -r &lt;文件名&gt;<br />(这个文件名就是系统崩溃时你正在编辑的文件)你就可以恢复出你的论文来.只敲<br />vi -r将把所有可能恢复的文件都列出来.<br /><br />3.3 - 有没有使vi对程序员更友好的窍门?<br />:set ai可以让vi自动对齐.<br />:set sw=#,#是移动的宽度(shiftwidth),或者说TAB键的宽度(tabwidth);你可以<br />用&lt;&lt;或者&gt;&gt;命令来左移或右移某一行. 还有, 你可以使用 &lt;%或&gt;%来将{,(或[等符号<br />括起来的文本都左移或右移;这时候,你必须把光标放在这些符号({,(或[)上面.<br />:set sm会在你敲},]或)显示出对应匹配的{,[或(来.<br />:set lisp会对lisp编程有些帮助. ()被移到s表达式(s-expressions)外面,如果<br />原子(atoms)没有停止则{}将被移走.<br /><br />3.4 - 宏 -- 我怎样写宏?<br />:map &lt;lhs&gt; &lt;rhs&gt;, 其中&lt;lhs&gt;最多10个字符,&lt;rhs&gt;最多100个字符. 以后,如果<br />你敲了&lt;lhs&gt;,vi就会用&lt;rhs&gt;来取代它.所有的宏都是在命令模式下开始的,但是可以<br />在你想在的模式下终止. 记住,在你想用的控制字符前面加上^V.<br />:unmap &lt;lhs&gt;将删除这个宏. :map！&lt;lhs&gt; &lt;rhs&gt; 使得&lt;lhs&gt;将&lt;rhs&gt;插入到文档<br />中去.<br /><br />3.5 - 我怎样将一个功能键定义成一个宏?<br />如果&lt;lhs&gt;是#n,n是0-9之间的一个数,那么这个宏就映射成某一个功能键了.(你<br />可以试一下F1-F10之间的键--译者)<br /><br />3.6 - 有没有办法缩写文本?<br />当然了. 这可是vi呀,它能做任何事情!<br />:ab email <a href="mailto:ellidz@midway.uchicago.edu"><font color="#333333">ellidz@midway.uchicago.edu</font></a> 可以在你敲完email后,把那个没有缩写<br />的文本插入到文件中. :una email取消缩写.<br /><br />3.7 - 我怎样在当前文档中做拼写检查?<br />这儿有一个宏可以做到这一点. 这些应该放在你的.exrc文件中(后面我们将对.exrc<br />进一步讨论). 它是一个相当简单的宏. 它仅仅是调用ispell来处理当前文件.当然,你<br />的系统里面一定得有ispell这个程序. 使用它的时候,只需要敲个V键就行了(因为vi并<br />没有用V,所以V是一个比较合适的键)<br /><br />map V :w^M:!ispell % ^M:e!^M^M<br /><br />第二个^M使你在拼写检查完之后无须敲回车就可以到vi中.<br />(译注, 在我的系统里,没有ispell,只有spell,我用它替换了ispell,工作的不错;还有,<br />^M不是两个字符,而是一个字符,通过^V^M敲进去的;另外,我个人认为第二个^M还是不要<br />的好,因为直接回到vi后你就无法看到拼写检查的结果了)<br /><br />3.8 - 我手头有一个硬拷贝的终端, 我还能用vi吗?<br />好了,好了. 我并认为有人会真的问这个问题.这个问题太偏了,我们大可不必理<br />它.(而且,它回答了一个非常普通的问题)<br />vi启动的时候处于一种特殊的模式下面,叫做"开放模式"; 在这种状态下,事情或多或少<br />的有些不同. 删除的字符在你面前显示成一些',vi会认为你的终端窗口只有一行. ^r<br />可以把当前行重新输出. z则把当前行周围的窗口重画一遍.<br /><br />3.9 - 好了,是不是处在开放模式下的原因呀?! 但是我现在没有用硬拷贝终端,它还是在开放<br />模式呀?<br />这儿的问题就是vi没有认出你用的终端的类型. 于是它假定你有的是个最烂的终端,<br />所以它决定依然处在开放模式下.这似乎没什么用处.因为没有多少人喜欢开放模式,但是开放<br />模式还是需要知道你的终端的一些最起码的信息的.<br />现在,我们来看如何解决这个问题.我们有可能把它分成几种特殊的情形,但是,一般情况下,<br />这并没有用处. 如果你直到你的终端的类型, 你可以在UNIX提示符下面设置终端类型(在CSH<br />及其变种下面,使用命令setenv TERM &lt;终端类型&gt;;在SH及其变种下面,使用命令TERM=&lt;终端类型&gt;;<br />export TERM)<br />最好你能把上面的命令写在.profile文件或者.cshrc文件里面,这样你一登录它就自动地给<br />你设置好了.(当然,你应该知道如何使用ed,或者你能在UNIX提示符下面设置好终端类型以便能<br />使用vi, 这样你才有可能去编辑这些文件)<br />如果你确实不知道你地终端类型,试一试vt100.现在大多数地终端或者终端仿真器都能仿真<br />vt100. 如果这还不能生效的话,你只好去找个高手来帮你了.<br /><br />4.0 - vi档案的在线帮助在哪儿?<br />有一个vi的FAQ,其中列出了vi档案的所有在线文件. 同时它还列出了这些文档<br />的镜象站点. 最主要的一个地址是alf.uib.no,但是这些文档在很多很多地地方<br />都保存着. vi-archive faq把它们都给列出来了.你在下载这些文件之前一定要<br />核对一下这个FAQ.因为很有可能有一个站点比去挪威的站点更近更快些.<br />一个镜象站点是cs.uwp.edu/pub/vi, 另一个是monu6.cc.monash.edu.au/pub/Vi,<br />这些站点上有很多有关vi的文件,还有一些vi的变种版本;当然,UCB版本的vi是<br />肯定有的, 还有许多的宏.<br /><br />5.0 - 好玩的vi诀窍,好玩的宏<br />这一节主要讲述一些无聊的诀窍和一些无聊的宏.事实上,任何vi的诀窍和宏我们<br />都欢迎,只要它们不是过分冗长. 如果有人向我建议而我也认为确实值得加的话,<br />我会考虑加进去的.<br /><br />5.1 - 好玩的vi诀窍<br />xp 删除光标下的字符,再把粘贴到后面去.换句话说,它交换了当前两个字符<br />的位置.<br />ddp 和xp类似,不过是交换两行的位置.<br />uu 撤消和重复上次所做的修改.(这可以使你不改变什么东西就可以到你上次所<br />做的修改处)<br /><br />5.2 - 好玩的宏<br />和垂直上方的字符交换位置<br />map * kxjphxkP<br /><br />折行<br />map g $80|F r<br />(译注,我对这条宏表示疑问!)<br /><br />改变大多数单词的大小写<br />map v ywmno:s/./\~/g<br />(译注,这条好象也不大对!)<br /><br />在当前的单词周围加上`和'<br />map *` i`'<br />在当前的单词周围加上'和'<br />map *' i''<br />在当前的单词周围加上"和"<br />map *" i""<br />(这几条也太无聊了吧--译注)<br />在当前的单词周围加上``和``<br />map! `` `'<br />(咦,好象又有问题?--译注)<br /><br />从光标处把当前行分开,在下一行开头加上一个&gt;号(例如,引用USENET).如果加上了单词的折行<br />功能那么最后一个单词可能被折在第一行.<br />map g may0O`ay$:s/./ /g<br />(不对吧--译注)<br /><br />插入一个字符<br />map g i$^[r<br /><br />6.0 - 依字母顺序的vi快速参考<br />... 是指有些东西需要在命令之前或之后指明.这通常是说光标的移动键<br />(h,j,k,l,w,b等等)或者是指行号.<br /># (这里#代表一个数字) 执行n次后面的命令...<br />: 进入ex模式<br />) 下一句<br />( 上一句<br />} 下一段<br />{ 上一段<br />]] 下一节<br />[[ 上一节<br />0 行的开头<br />$ 行的末尾<br />^ 行的第一个非空白字符<br />+ 下一行的开头<br />- 上一行的开头<br />(空格) 下一个字符<br />(回车) 下一行<br />/ 向前搜索<br />? 向后搜索<br />% 查找当前小(中,大)括号的匹配字符<br />, 逆向重复上一个f,F,t或T操作<br />; 重复上一个f,F,t或T操作<br />. 重复上一个操作<br />` 转到标记处<br />' 转到标记所在行的开头<br />`` 查找前回到上一个做标记的地方<br />'' 查找前回到上一个做标记所在行的开头<br />~ 切换字符的大小写<br />" 保存到寄存器中<br />!! 重复上一次SHELL命令<br />! 把后面的文本送给命令, 取代输出(例如, !}fmt把当前的段落<br />送给命令fmt处理,然后用fmt返回的东西替换输出.)<br />&gt;&gt; 右移当前段落一个移动宽度(shiftwidth)<br />&lt;&lt; 左移当前段落一个移动宽度(shiftwidth)<br />&gt;% 从当前到匹配小(中,大)括号之间的文本右移<br />&lt;% 从当前到匹配小(中,大)括号之间的文本左移<br />(似乎漏了一个符号|, 移动到某一列----译注)<br />a 在当前位置之后添加<br />A 在当前行的末尾添加<br />^a 没有使用<br />b 上一个单词的开头<br />B 上一个单词的开头,忽略标点符号<br />^b 上移一屏<br />c 覆盖...<br />C 覆盖到行末尾<br />^c 终止插入模式,在命令模式没有用<br />d 删除...<br />D 删除到行末尾<br />^d 下移半屏，如果在插入模式下则移到上一个移动宽度（ShiftTab)处<br />e 单词的末尾<br />E 单词的末尾,忽略标点符号<br />^e 屏幕下卷一行<br />f 查找...<br />F 向后查找...<br />^f 下移一屏<br />g 未用<br />G ...跳至[缺省是到文件末尾]<br />^g 显示状态栏<br />h 左移<br />H 屏幕上的第一行<br />^h 在插入模式下是退格,命令模式下是左移<br />i 在当前的位置前面插入<br />I 在本行的第一个非空白字符前面插入<br />^i 插入模式下是制表键,命令模式下未用<br />j 下移<br />J 把下一行合并到本行<br />^j 命令模式下是下移,插入模式下是建一个新行<br />k 上移<br />K 未用<br />^k 未用<br />l 右移<br />L 屏幕中的最后一行<br />^l 重绘屏幕<br />m 把当前位置标记到寄存器中<br />M 屏幕的中间行<br />^m 回车<br />n 重复上次查找<br />N 逆向重复上次查找<br />^n 命令模式下是下移<br />o 在当前行的下面建一个新行<br />O 在当前行的上面建一个新行<br />^o 未用<br />p 在当前行的下面粘贴<br />(译注--应为在当前位置的后面粘贴)<br />P 在当前行的上面粘贴<br />(译注--应为在当前位置的前面粘贴)<br />^p 命令模式下是上移<br />q 未用<br />Q 退出并且启动ex<br />^q 未用<br />r 覆盖当前的字符<br />R 在插入模式下一直覆盖字符<br />^r 在命令模式下面重绘屏幕<br />s 替换<br />S 替换整行<br />t 到...<br />T 向后到...<br />^t 移到下一个移动宽度(shifttab)处<br />u 撤消上一次操作<br />U 撤消对本行的所有修改<br />^u 上移半屏<br />v 未用<br />V 未用<br />^v 未用<br />w 下一个单词的开头<br />W 下一个单词的开头,忽略标点符号<br />^w 命令模式下未用,在插入模式下是到上一个单词的开头处<br />x 删除当前字符<br />X 删除前一个字符<br />^x 未用<br />y 复制...<br />Y 复制整行<br />^y 屏幕上卷一行<br />z 重新配置当前行周围的屏幕<br />ZZ 保存之后退出<br />^z 未用<br />(译注--在命令模式下,^z执行了UNIX暂停操作)<br /><br />6.1 - 命令模式的输入选项(:命令)<br />(注: 这不是一个规范的列表,, 我只是列出了一些最重要的命令)<br />:r &lt;文件&gt; 把&lt;文件&gt;读入到当前文档<br />:r !&lt;命令&gt; 把&lt;命令&gt;的输出插入到当前文本中<br />:nr &lt;文件&gt; 把&lt;文件&gt;插入到第n行<br />:!&lt;命令&gt; 运行&lt;命令&gt;,然后返回<br />:sh 转到SHELL<br />:so &lt;文件&gt; 读取&lt;文件&gt;,再执行文件里面的命令<br />(译注--文件中的命令应该都是一些ex命令)<br />icon_mad.gif 保存之后退出<br />:wq 保存之后退出<br />:l1,l2w &lt;文件&gt;把第l1和第l2行之间的文本写到&lt;文件&gt;中去,如果没有指定&lt;文件&gt;,<br />vi就假定是当前文件,如果没有指定l1,l2,就假定是整个文件(就成了:w)<br />:w &gt;&gt; &lt;文件&gt; 添加到&lt;文件&gt;末尾. 也可以使用行号<br />:w! 覆盖当前文件<br />:q 退出<br />:q! 不存盘就退出<br />:e &lt;文件&gt; 不离开vi编辑&lt;文件&gt;<br />:e! 重新编辑当前文件,忽略所有的修改<br />:n 编辑下一个文件<br />:e +n &lt;文件&gt; 从第n行开始编辑&lt;文件&gt;,如果超过了末尾,就从末尾开始编辑<br />:e# 编辑替换文件(如果使用了命令:e&lt;文件&gt;,替换文件就指的是原始文件)<br />:args 显示所有要编辑的文件<br />:rew 重新回到第一个编辑的文档<br />:map m n 创建一个宏(使 m 做 n)<br />:map! m n 创建一个插入模式的宏(使 m 做 n)<br />:unmap m 删除宏m<br />:unmap! m 删除插入模式的宏m<br />:ab &lt;1&gt; &lt;2&gt; 缩写,敲&lt;1&gt;的时候用&lt;2&gt;取代<br />:unab &lt;1&gt; 取消缩写&lt;1&gt;<br />:set &lt;选项&gt; 设置&lt;选项&gt;...<br /><br />6.2 - 设置选项(set)<br />可以使用括号中的缩写形式. 语法:<br />:set &lt;选项&gt; &lt;参数&gt; (如果需要参数的话)<br />也可以在一行中指定多个选项<br />:set &lt;选项&gt;? 显示出当前这个选项的参数值<br />:set all 则显示所有的选项值<br />对那些无须参数的选项来说,使用:set no&lt;选项&gt;就可以把它给关了<br /><br /><br />选项: 缺省值: 含义:<br />autoindent (ai) noai 使新行自动缩进,和上(下)行的位置对齐<br />autoprint (ap) ap 每条命令之后都显示出修改之处<br />autowrite (aw) noaw 在:n,:!命令之前都自动保存文件<br />beautify (bf) nobf 在输入的时候忽略所有的控制字符<br />(除了制表键(tab),换行(newline),进纸(formfeed))<br />directory= (dir=) /tmp 存放缓冲区的目录名<br />edcompatible noedcompatible 在替换的时候使用类ed的用法<br />errorbells (eb) errorbells 出错的时候响铃<br />exrc (ex) noexrc 允许在主目录(home)外面之外放.exrc文件<br />hardtabs= (ht=) 8 设置硬制表的边界<br />ignore case (ic) noic 正规式里忽略大小写<br />lisp nolisp 打开lisp模式<br />list nolist 显示所有的制表键和行的结尾<br />magic magic 可以使用更多的正规表达式<br />mesg mesg 允许向终端发送消息<br />number (nu) nonumber 显示行号<br />open open 允许开放和可视化<br />optimize (opt) optimize 优化吞吐量,打印时不发回车<br />paragraphs= (para=) IPLPPPQPPLIbp 设置{ &amp; }的分界符<br />prompt prompt 命令模式下的输入给出:的提示符<br />readonly (ro) noro 除非用!号否则不准保存文件<br />redraw noredraw 当编辑的时候重绘屏幕<br />remap remap 允许宏指向其他的宏<br />report= 5 如果影响的行数&gt;这个数的话就报告<br />scroll 1/2 window 下卷屏幕时滚动屏幕的数目,<br />同样这也是z命令输出的行数(z 输出2倍滚屏的大小)<br />sections= SHNHH HU 定义节的末尾(当使用命令[[ 和 ]] 时)<br />shell= (sh=) /bin/sh 缺省的SHELL,如果设置了环境变量SHELL的话,就使用变量<br />shiftwidth= (sw=) 8 当使用移动(shift)命令时移动的字符数<br />showmatch (sm) nosm 显示{, }, (, ), [, 或者 ] 的匹配情况<br />showmode noshowmode 显示你处在什么模式下面<br />slowopen (slow) 插入之后不要立刻更新显示<br />tabstop= (ts=) 8 设置制表停止位(tabstop)的长度<br />taglength= (tl=) 0 重要标记的字符个数(0表示所有的字符)<br />tags= tag, /usr/lib/tags 定义包含标记的文件路径<br />term= 设置终端类型<br />terse noterse 显示简短的错误信息<br />timeout (to) timeout 一秒钟后键盘映射超时<br />ttytype= 设置终端类型<br />warn warn 显示"No write since last change"信息<br />window= (w=) 可视模式下窗口的行数<br />wrapmargin= (wm=) 0 右边距,大于0的话最右边的单词将折行,留出n个空白位置<br />wrapscan (ws) ws 查找到文件尾后再重头开始<br />writeany (wa) nowa 可以保存到任意一个文件去<br /><br />(译注--这些选项在各种vi版本中都基本上大同小异,以SunOS带的vi为例,它没有这里列出来的open选项,<br />scroll的参数值也不同,还多出来一些选项,如flash,modelines,novice,tagstack等等)<br /><br />7.0 - 建立 .exrc文件<br />所有命令输入模式下的命令(即 :命令)都可以在.exrc文件中使用,在.exrc中的命令在启动vi的时候自动<br />加载.尤其是源命令(so),缩写(ab)和宏定义都可以用.在.exrc中不允许有空行.以"开头的一行vi将把它当成<br />注释.<br /><br />7.1 - .exrc文件的样本<br />以下的.exrc文件是一个实际的例子, 我自己的. 因此,它就没有有些人想象的那样设置很多的选项.即便<br />如此,它还是给出一些基本的概念,而且它也相当易懂.<br /><br />首先,记住你无须在命令前面加:号,因为它是缺省就添加了的.<br /><br />"译注--以下是.exrc文件中的内容,为真实起见,而且事实上也相当浅显,我没有翻译其中的注释<br />" set wordwrap 9 characters from the right<br />set wm=9<br />" show matching parenthesis. When },), or ] is hit, show the opening<br />" {,(, or [ that matches it.<br />set sm<br />" set the shell to be /usr/local/bin/tcsh<br />set sh=/usr/local/bin/tcsh<br />" a few abbreviations<br />" this makes -l automatically become -Larry, and zidlle to be my<br />" name and email address.<br />ab zidlle E. Larry Lidz - <a href="mailto:ellidz@midway.uchicago.edu"><font color="#333333">ellidz@midway.uchicago.edu</font></a><br />ab -l -Larry<br />" uppercase V will run ispell -x (-x tells it not to save backups) on current<br />" file<br />map V :w<br />" K will center the line... (this doesn't work on SunOS -- ??)<br />map K :s/^[ ]*//<br />" v will reformat the current paragraph<br />map v {0!}fmt<br />" q runs a program to lock my terminal<br />map q :!lock2<br />" Splits a line in two at current cursor location, puts a &gt; at the<br />"beginning of the line - useful for Usenet/email<br />map g may0O`ay$:s/./ /g<br /><br />8.0 - vi的bug<br />我很想说vi中没有bug,但很不幸,它不是这样的. 这些bug都是初始版本vi中的,<br />它其他的一些变种就不一定有.<br />例如 _宏有时就运行的有问题.<br /><br />9.0 - 术语表<br />如果有人提议说某个术语他不明白,我们将更新这个术语表.如果你有什么建议,<br />请一定要告诉我.<br /><br />命令模式 command mode<br /><br />命令模式是说我们在此模式下面可以向vi发命令(包括光标移动,编辑命令等等)<br /><br />ed<br />UNIX里面一个非可视化的编辑器<br /><br />&lt;Esc&gt;<br />escape键. 键盘上标记为escape(ESC)的一个键.有时候^[可以起到相同的作用.<br />如果没有escape键,你可以试试Meta键<br />ex<br />UNIX下的一个编辑器.所有vi中的:命令都是送给它处理的<br /><br />插入模式 insert mode<br />插入模式是指我们可以在此模式下面键入文本.<br /><br />宏 macro<br />宏是一些键的组合起来的快捷方式.例如,某个宏允许我们只敲一个键就可以执行<br />好几个不同的命令.<br /><br />开放模式 open mode<br />开始模式是说vi启动的时候不能确定你的终端类型,或者它肯定你的是一个硬的或<br />电子管的终端<br /><br />正规表达式 regular expressions (RegEx)<br />正规表达式,通常缩写为"RegEx",是一些关键字的集合,它允许用户在查找的时候有更大的<br />控制力度. RegEx是在UNIX下面用的,但是在很多程序中也用到了它.<br /><br />sed<br />流-行式的编辑器.它没有界面,所有命令都是通过命令行的形式给出的.<br /><br />vi<br />就是这个FAQ讨论的编辑器</font> </p>
		http://www.sci.muni.cz/docs/Unix/vi.html<br />http://www.roxanne.org/vi.html<br /><img src ="http://www.cnitblog.com/charester/aggbug/20938.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cnitblog.com/charester/" target="_blank">天空</a> 2006-12-21 20:36 <a href="http://www.cnitblog.com/charester/archive/2006/12/21/20938.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>汉化cygwin(ZT)</title><link>http://www.cnitblog.com/charester/archive/2006/12/16/20614.html</link><dc:creator>天空</dc:creator><author>天空</author><pubDate>Sat, 16 Dec 2006 06:54:00 GMT</pubDate><guid>http://www.cnitblog.com/charester/archive/2006/12/16/20614.html</guid><wfw:comment>http://www.cnitblog.com/charester/comments/20614.html</wfw:comment><comments>http://www.cnitblog.com/charester/archive/2006/12/16/20614.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cnitblog.com/charester/comments/commentRss/20614.html</wfw:commentRss><trackback:ping>http://www.cnitblog.com/charester/services/trackbacks/20614.html</trackback:ping><description><![CDATA[汉化cygwin<br /><br />默认情况下，cygwin的大部分命令是不支持中文的，比如ls，显示出来的都是问号 <br /><br />但是我们可以通过修改一些设置使它支持中文 <br />首先，进入到用户主目录下<br />cd ~<br />然后找到.inputrc，没有的话就新建<br />在后面加上<br />set meta-flag on<br />set convert-meta off<br />set output-meta on<br /><br />然后是.bashrc 或.bashprofile<br />export LESSCHARSET=latin1<br />alias ls='ls --show-control-chars --color=auto'<img src ="http://www.cnitblog.com/charester/aggbug/20614.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cnitblog.com/charester/" target="_blank">天空</a> 2006-12-16 14:54 <a href="http://www.cnitblog.com/charester/archive/2006/12/16/20614.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title> 国外linux相关优秀站点地址【不断完善中】 </title><link>http://www.cnitblog.com/charester/archive/2006/11/18/19280.html</link><dc:creator>天空</dc:creator><author>天空</author><pubDate>Sat, 18 Nov 2006 03:02:00 GMT</pubDate><guid>http://www.cnitblog.com/charester/archive/2006/11/18/19280.html</guid><wfw:comment>http://www.cnitblog.com/charester/comments/19280.html</wfw:comment><comments>http://www.cnitblog.com/charester/archive/2006/11/18/19280.html#Feedback</comments><slash:comments>7</slash:comments><wfw:commentRss>http://www.cnitblog.com/charester/comments/commentRss/19280.html</wfw:commentRss><trackback:ping>http://www.cnitblog.com/charester/services/trackbacks/19280.html</trackback:ping><description><![CDATA[The original intention of this topic is to collect the excellent and useful URL address from foreign Website.May this documnetation is deficient.Therefore,come on,guys,let's do this meaningful job together.You can send your favorite site's address behind.And I will check and add it on .3x :-）<br /><h4><first><font color="#ff6600"><font size="+1"><first></first></font>&lt;I&gt;News---The News About Linux and Open Source</font></first></h4><h4><first></first></h4><table style="WIDTH: 737px" bordercolor="#999999" cellspacing="5" cellpadding="5" border="1"><tbody><tr><td>Name</td><td>URL</td><td>Description</td></tr><tr><td>NewsForge</td><td><a href="http://www.newsforge.com/" target="_blank"><font color="#330000">http://www.newsforge.com/</font></a></td><td><font face="Verdana, Geneva, Arial, Helvetica, sans-serif">The online Newspapaer for Linux and open source</font></td></tr><tr><td>LWN</td><td><a href="http://lwn.net/" target="_blank"><font color="#330000">http://lwn.net/</font></a></td><td><font face="Verdana, Geneva, Arial, Helvetica, sans-serif">The site which provides comprehensive coverage of development, legal, commercial, and security issues. Its </font><font face="Verdana, Geneva, Arial, Helvetica, sans-serif" color="#660000">Weekly Edition</font><font face="Verdana, Geneva, Arial, Helvetica, sans-serif"> is weekly summary of what has happened in the free software world.that is Top-notch; And Its front page offers up-to-the-minute coverage.</font></td></tr><tr><td>LXer</td><td><a href="http://lxer.com/" target="_blank"><font color="#330000">http://lxer.com/</font></a></td><td><font face="Verdana, Geneva, Arial, Helvetica, sans-serif">Aanother Linux news site.Unlike other sites like Newsforge,linuxtoday with more and more Ads.LXer almost with no Ads.And it have a clean and simple layout.The colum "</font><font face="Verdana, Geneva, Arial, Helvetica, sans-serif" color="#660000"><strong>Today's Big Story</strong></font><font face="Verdana, Geneva, Arial, Helvetica, sans-serif">" is very interesting.</font></td></tr><tr><td>LinuxToday</td><td><a href="http://www.linuxtoday.com/" target="_blank"><font color="#330000">http://www.linuxtoday.com/</font></a></td><td><font face="宋体"><font face="Verdana, Geneva, Arial, Helvetica, sans-serif">Linux News on Internet time.fully and plentiful news on Linux and open source</font>.</font></td></tr><tr><td>LinuxInsider</td><td><a href="http://www.linuxinsider.com/" target="_blank"><font color="#330000">http://www.linuxinsider.com/</font></a></td><td><font face="Verdana, Geneva, Arial, Helvetica, sans-serif">News reported by many categories.</font></td></tr><tr><td>SlashDot</td><td><a href="http://slashdot.org/" target="_blank"><font color="#330000">http://slashdot.org/</font></a></td><td><font face="Verdana, Geneva, Arial, Helvetica, sans-serif" size="-1">Source for technology related news with a heavy slant towards Linux and Open Source issues</font></td></tr><tr><td>LinuxWatch</td><td><a href="http://www.linux-watch.com/" target="_blank"><font color="#330000">http://www.linux-watch.com/</font></a></td><td><font face="Verdana, Geneva, Arial, Helvetica, sans-serif" size="-1">Keep eyes on Linux pengui.Aggregated headlines from Indepedent Linux and open source network</font></td></tr><tr><td>OSNews</td><td><a href="http://www.osnews.com/" target="_blank"><font color="#330000">http://www.osnews.com/</font></a></td><td><font face="Verdana, Geneva, Arial, Helvetica, sans-serif" size="-1">A site informs you about the latest news on a vast range of operating systems, from the well-known mainstream OSes, down to small embedded (but also very interesting technically) ones.</font></td></tr></tbody></table><br /><h4><second><font color="#ff6600"><strong><second></second></strong>&lt;II&gt;The entries for Linux Newbies---installtion,Manpages,Documentaion and other useful articals</font></second></h4><h4><second></second></h4><second><font color="#660000">1&gt;Where to get the Linux CD/DVD ISO images? And Which Linux Distribution I should choose.</font></second><table style="WIDTH: 736px" cellspacing="5" cellpadding="5" border="1"><tbody><tr><td>Name</td><td>URL</td><td>Description</td></tr><tr><td>LinuxISO<br /></td><td><font class="content" color="#330000"><a href="http://www.linuxiso.org/" target="_blank">http://www.linuxiso.org/</a></font></td><td><font face="Verdana, Geneva, Arial, Helvetica, sans-serif">Where to get the Linux CD/DVD ISO imgaes? Just Come to here.Of course you can go to The HomePage of The Linux Distributions like "www.debian.org" "www.redhat.org" etc.<br />But Here is The collection of</font><font face="Verdana, Geneva, Arial, Helvetica, sans-serif" color="#009900"><font color="#660000">almost all of the popular Linux distribution</font></font><font face="Verdana, Geneva, Arial, Helvetica, sans-serif">. the distribution recommended are"SuSE ,redhat,ubuntu" for Linux newbies.And some information of them is show as follows.</font></td></tr><tr><td>SuSE</td><td><a href="http://www.suse.com/" target="_blank"><font color="#330000">http://www.suse.com</font></a></td><td><font face="Verdana, Geneva, Arial, Helvetica, sans-serif">Probalbly </font><font face="Verdana, Geneva, Arial, Helvetica, sans-serif" color="#660000">the best distribution for unexperimented users</font><font face="Verdana, Geneva, Arial, Helvetica, sans-serif"><font color="#660000">.</font><br />The Desktop of SUSE is based on KDE.It is not only more Beutiful than the MS Windows',but also very easy to use.And it is belonged to Nevell Corporation.</font><br /><small></small></td></tr><tr><td>Fedora </td><td><a href="http://fedora.redhat.com/" target="_blank"><font color="#330000">http://fedora.redhat.com</font></a></td><td><font face="Verdana, Geneva, Arial, Helvetica, sans-serif">The distribution which inhenrited the future of Redhat--easy to install.For its parent is RedHat, you will find the most information on the internet among the distributions.</font></td></tr><tr><td>Ubuntu</td><td><a href="http://www.ubuntu.com/" target="_blank"><font color="#330000">http://www.ubuntu.com/</font></a></td><td><font face="Verdana, Geneva, Arial, Helvetica, sans-serif">A distribution based on "Debian",pronouced as </font><font face="Verdana, Geneva, Arial, Helvetica, sans-serif" size="-1">“<font color="#660000">oo-boon-too</font>”.The most </font><font face="Verdana, Geneva, Arial, Helvetica, sans-serif">attractive thing on ubuntu is that the ubuntu commutity </font><font face="Verdana, Geneva, Arial, Helvetica, sans-serif" color="#660000">presents the CD/DVD disks as a gift</font><font face="Verdana, Geneva, Arial, Helvetica, sans-serif"><font color="#660000"></font>to Linux users .Really?Yes,I am sure That I have not make fun on you .<img alt="" src="http://oss.lzu.edu.cn/uploads/smil3dbd4d6422f04.gif" /> In fact, I am keeping almost twenty sets of them now.Somebody who wants to</font><font face="Verdana, Geneva, Arial, Helvetica, sans-serif"></font><font face="Verdana, Geneva, Arial, Helvetica, sans-serif">entertain ubuntu can attact to me by Tecent qq (273610766)</font></td></tr><tr><td></td><td></td><td></td></tr><tr><td></td><td></td><td></td></tr><tr><td></td><td></td><td></td></tr><tr><td></td><td></td><td></td></tr><tr><td></td><td></td><td></td></tr><tr><td></td><td></td><td></td></tr></tbody></table>2&gt;The Linux installtion FAQ<br /><br /><font color="#660000">3&gt;where to get the MAN pages ,Documentaion and useful articals</font><br /><table style="WIDTH: 735px" cellspacing="5" cellpadding="5" border="1"><tbody><tr><td>Name</td><td>URL</td><td>Desicription</td></tr><tr><td>TLDP</td><td><a href="http://tldp.org/" target="_blank"><font color="#330000">http://tldp.org</font></a></td><td>TLDP is the abbreviation of "The Linux Documentation Project".It is the first stop to linux users find documentation.</td></tr><tr><td>MAN Pages</td><td><font class="content"><a href="http://linux.ctyme.com/" target="_blank"><font color="#330000">http://linux.ctyme.com/</font></a></font></td><td>The Indexed HTML version of Linux MAN Pages.And it is updated to Redhat fedora.Asorted to nine sections. Including almost all of the linux command MAN pages .</td></tr><tr><td><font class="content">UsingLinux </font></td><td><font class="content" color="#330000"><a href="http://www.usinglinux.org/" target="_blank">http://www.usinglinux.org/</a></font></td><td>A site with many useful documentations and software.</td></tr><tr><td><font class="content">LinuxDirectory </font></td><td><font class="content" color="#330000"><a href="http://www.linux-directory.com/" target="_blank">http://www.linux-directory.com/</a></font></td><td>Many books on linux,perl,php,java,open source and etc.And with several linux CD/DVD images for download.</td></tr><tr><td><font class="content">LinuxWorld </font></td><td><font class="content" color="#330000"><a href="http://www.linuxworld.com/" target="_blank">http://www.linuxworld.com/</a></font></td><td>With both of Documentations and software.</td></tr><tr><td><font class="content">IBM Linux Zone </font></td><td><font class="content" color="#330000"><a href="http://www-128.ibm.com/developerworks/linux/" target="_blank">http://www-128.ibm.com/developerworks/linux/</a></font></td><td><font size="-1">The linux tutorial zone of<br />IBM. Contains articles related to software development in linux<font color="#cc0033"></font>.</font></td></tr><tr><td><font class="content"></font></td><td></td><td></td></tr><tr><td></td><td></td><td></td></tr><tr><td></td><td></td><td></td></tr></tbody></table><br /><font color="#660000">4&gt;How to find more cool Linux website.Here is two cool two websites to collect links about linux.</font><br /><table style="WIDTH: 735px" cellspacing="5" cellpadding="5" border="1"><tbody><tr><td>Name</td><td>URL</td><td>Description</td></tr><tr><td>LOLL</td><td><font class="content"><a href="http://loll.sourceforge.net/linux/links/" target="_blank"><font color="#330000">http://loll.sourceforge.net/linux/links/</font></a></font></td><td>LOLL is the abbreviation of the string "Loads of Linux Links".It have already collect more than 5,000 links on linux and open source already.</td></tr><tr><td>Linux Center</td><td><font class="content"><a href="http://www.linux-center.org/" target="_blank"><font color="#330000">http://www.linux-center.org/</font></a></font></td><td></td></tr><tr><td></td><td></td><td></td></tr><tr><td></td><td></td><td></td></tr></tbody></table><font color="#660000"><br />5&gt;where can I found the free software?</font><br /><table height="287" cellspacing="5" cellpadding="5" width="738" border="1"><tbody><tr><td>Name</td><td>URL</td><td>Description</td></tr><tr><td>SourceForge</td><td><font class="content" color="#330000"><a href="http://sourceforge.net/" target="_blank">http://sourceforge.net/</a></font></td><td><font size="-1">The world's largest development and download repository of Open Source code and applications.</font></td></tr><tr><td>FreshMeat</td><td><font class="content"><a href="http://freshmeat.net/" target="_blank"><font color="#330000">http://freshmeat.net</font></a></font></td><td><font size="-1">A site maintains the Web's largest index of Unix and cross-platform open source software. Thousands of applications are meticulously cataloged in the <font color="#cc0033"></font>database, and links to new code are added daily.</font></td></tr><tr><td><font class="content">IceWalkers </font></td><td><font class="content"><a href="http://www.icewalkers.com/" target="_blank"><font color="#330000">http://www.icewalkers.com/</font></a></font></td><td><font size="-1">Linux Software. <font color="#cc0033">IceWalkers</font>.com provides a vast database of Linux Software. Updated several times a day with new Linux Software release announcements</font></td></tr><tr><td>Tucows</td><td><a href="http://www.tucows.com/" target="_blank"><font color="#330000">http://www.tucows.com/</font></a></td><td>Tucows <font size="-1">has over 40000 software titles that are tested, rated, reviewed and ready to download. <font color="#cc0033">Tucows</font> is your download destination for Linux ,Windows, Macintosh.</font></td></tr><tr><td><font class="content">LinuxGames </font></td><td><font class="content" color="#330000"><a href="http://www.linuxgames.com/" target="_blank">http://www.linuxgames.com/</a></font></td><td>Want to player games under linux? Go to LinuxGames site to find your answer.</td></tr><tr><td><font class="content">Scientific App on linux</font></td><td><font class="content" color="#330000"><a href="http://gd.tuwien.ac.at:8050/sal1.shtml" target="_blank">http://gd.tuwien.ac.at:8050/sal1.shtml</a></font></td><td>Contains many <font class="content">Scientific application on linux.</font></td></tr><tr><td><font class="content">RpmFind</font></td><td><font class="content" color="#330000"><a href="http://www.rpmfind.net/" target="_blank">http://www.rpmfind.net/</a></font></td><td>This site provides the search service.you can use it to find<br />package by either the name(apache),provides(webserver),<br />absolute file names(/usr/bin/apache),binaries or shared libraries.</td></tr></tbody></table><br /><font color="#660000">6&gt;How to use theses software in desktop use.</font><br /><table height="182" cellspacing="5" cellpadding="5" width="737" border="1"><tbody><tr><td>Name</td><td>URL</td><td>Description</td></tr><tr><td><font class="content">DesktopOS </font></td><td><font class="content" color="#330000"><a href="http://www.desktopos.com/" target="_blank">http://www.desktopos.com/</a></font></td><td><font color="#330000"></font></td></tr><tr><td><font class="content">DesktopLinux</font></td><td><font class="content"><a href="http://www.desktoplinux.com/" target="_blank"><font color="#330000">http://www.desktoplinux.com/</font></a></font></td><td></td></tr><tr><td></td><td></td><td></td></tr><tr><td></td><td></td><td></td></tr></tbody></table><br />7&gt;General linux sites<br /><table height="182" cellspacing="5" cellpadding="5" width="735" border="1"><tbody><tr><td>Name</td><td>URL</td><td>Description </td></tr><tr><td>Linux.com</td><td><font class="content" color="#330000"><a href="http://www.linux.com/" target="_blank">http://www.linux.com</a></font></td><td><font color="#330000"></font></td></tr><tr><td><font class="content">Linux Online </font></td><td><font class="content" color="#330000"><a href="http://www.linux.org/" target="_blank">http://www.linux.org/</a></font></td><td><font color="#330000"></font></td></tr><tr><td>OSDir</td><td><font class="content" color="#330000"><a href="http://osdir.com/" target="_blank">http://osdir.com</a></font></td><td><font color="#330000"></font></td></tr><tr><td><font color="#330000"></font></td><td><font color="#330000"></font></td><td><font color="#330000"></font></td></tr></tbody></table><br /><br /><font color="#660000">8&gt;some interesting sites.</font><big><strong><font face="Trebuchet MS" color="green"><br /><table height="211" cellspacing="5" cellpadding="5" width="736" border="1"><tbody><tr><td><font color="#000000">Name</font></td><td><font class="content"><font color="#000000">URL</font></font></td><td><font color="#000000">Description</font></td></tr><tr><td><font class="content"><font color="#000000">LinuxCounter</font></font></td><td><font class="content" color="#330000"><a href="http://counter.li.org/" target="_blank">http://counter.li.org/</a></font></td><td><font face="Verdana, Geneva, Arial, Helvetica, sans-serif" color="#000000" size="-1">Get yourself and your computer counted among the Linux users.And in this way you can find the Linux users in your same district.</font></td></tr><tr><td><big><font face="Trebuchet MS" color="green"><font color="#000000" size="3">Linus</font></font></big></td><td><big><font face="Trebuchet MS"><font class="content" color="#330000" size="3"><a href="http://www.cs.helsinki.fi/u/torvalds/" target="_blank">http://www.cs.helsinki.fi/u/torvalds/</a></font></font></big></td><td><big><font face="Trebuchet MS" color="green"><font color="#000000" size="3">The homepage of Linux Torvals.</font></font></big></td></tr></tbody></table></font></strong></big><img src ="http://www.cnitblog.com/charester/aggbug/19280.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cnitblog.com/charester/" target="_blank">天空</a> 2006-11-18 11:02 <a href="http://www.cnitblog.com/charester/archive/2006/11/18/19280.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>11.16.linux学习笔记之-Red Hat Enterprise Linux Step By Step Guide</title><link>http://www.cnitblog.com/charester/archive/2006/11/17/19250.html</link><dc:creator>天空</dc:creator><author>天空</author><pubDate>Fri, 17 Nov 2006 02:20:00 GMT</pubDate><guid>http://www.cnitblog.com/charester/archive/2006/11/17/19250.html</guid><wfw:comment>http://www.cnitblog.com/charester/comments/19250.html</wfw:comment><comments>http://www.cnitblog.com/charester/archive/2006/11/17/19250.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cnitblog.com/charester/comments/commentRss/19250.html</wfw:commentRss><trackback:ping>http://www.cnitblog.com/charester/services/trackbacks/19250.html</trackback:ping><description><![CDATA[阅读了Red Hat Enterprise Linux Step By Step Guide.kaka.pdf后，回顾一些模糊的知识点。<br /><br />1:To close man or Info pages, press [q]. <br />2: you can type the command startx to start the graphical desktop. <br />3: Red Hat Enterprise Linux installs GNOME as the default desktop. <br />4: To exit a shell prompt, click the X button on the upper right corner of the shell prompt window, type <br />exit at the prompt, or press [Ctrl]-[D] at the prompt. <br />5: Your password should be at least six characters. <br />6: To navigate the man page you can use the "arrow" keys or use the [Spacebar] to move down one page <br />and [B] to move up. To exit the man page, type [Q]. <br />To search a man page for keywords type [/] and then a keyword or phrase and press [Enter]. All <br />instances of the keyword will be highlighted throughout the man page, allowing you to quickly read <br />the keyword in context. <br />7: To install all of the Red Hat Enterprise Linux manuals, change <br />to the directory that contains the RPM _les and type the following:  rpm -ivh rhl-*.rpm <br />8: To shutdown your computer at a shell prompt, type the following command:halt <br />9: you must _rst unmount a _oppy before you eject it. <br />10: list the _les in your home <br />directory by entering the command ls -al. If you view the hidden _les in your home directory, <br />11: To use bzip2 to compress a _le, enter the following command at a shell prompt: <br />bzip2 filename <br />The _le is compressed and saved as filename.bz2. <br />To expand the compressed _le, enter the following command: <br />bunzip2 filename.bz2 <br />12: bash is the default shell for interactive users. <br />13: Press [Ctrl]-[R] and type <br />the beginning of the command you previously issued. <br />14: To clear your command history, type history -c. <br />15: By default, Red Hat Enterprise Linux stores 1000 commands. <br />16: For example, oowriter &amp; starts OpenOf_ce.org Writer <br />17: If you have started an application or process and forgotten to add the &amp;, _rst press [Ctrl]-[Z] . this <br />suspends the application. To allow it to continue running without displaying standard output, type bg <br />and press [Enter]. This is referred to as running the application in the background. <br />18: The asterisk, "*", represents any character or string of characters. The entry a*.txt could refer to <br />ab.txt as well as aardvark.txt. <br />The question mark represents a single character. The entry a?.txt could refer to ab.txt and <br />a1.txt, but not aardvark.txt. <br />19: If the _le is called sneak*.txt, type: <br />sneak\*.txt <br />Here is a brief list of wildcards and regular expressions: <br />. * . Matches all characters <br />. ? . Matches one character <br />. \* . Matches the * character <br />. \? . Matches the ? character <br />. \) . Matches the ) character <br />20: [Ctrl]-[K] While editing a command on the command line, this key combination <br />deletes everything that has been typed in from the cursor's current <br />position forward. <br />[Ctrl]-[D] Pressing this key combination once ends the current application or <br />process. Pressing it twice exits the shell. <br />[Ctrl]-[R] At the command line, [Ctrl]-[R] searches through the command history to <br />_nd the entry that starts with the letters you type. <br />[Ctrl]-[Z] Suspends the current application. Entering bg after [Ctrl]-[Z] causes a <br />program to run in the background. <br />[Ctrl]-[C] "Kills" a program. This should be a last resort. Try stopping a program <br />with other methods _rst. <br />[Ctrl]-[L] Clears the terminal window. <br />21: To clear the terminal, enter the command clear at the shell prompt. The clear command clears the <br />terminal, leaving only a new shell prompt at the top of the window. <br />You can also clear the screen using the keystroke [Ctrl]-[L]. <br />22: Copy a _le cp cp filename destination Copies the _le _lename to the <br />ls ls The ls command lists _les in <br />To move a _le from one <br />directory to another, use mv. <br />Rename a _le mv mv oldname newname The use of the mv command <br />23: To view all ls command options, read the man page by entering man ls at a shell prompt. To print <br />the man page, enter man ls | col -b | lpr at the prompt. <br />24: cp original_file /dir1/dir2/new_file <br />This creates a new _le named new_file with the contents of original_file in dir2/. <br />25: cp /dir1/dir2/filename . <br />The above command places a copy of filename in your current working directory. <br />26: You can only move _les to a directory that already exists: Linux will not create a new directory with <br />the mv command. <br />27: mv original_name /dir1/dir2/dir3/new_name <br />The above command moves the _le original_name from the current working directory to directory <br />dir3/ and renames it new_name. <br />28: Deleting a _le with rmis permanent . you cannot un-delete it. <br />29: The rmdir command will only delete directories that are empty. <br />If you want to delete a directory and all of its contents, use the command rm -rf. Note that if you <br />enter rm -rf, the shell will not ask if you are sure before permanently deleting the directory. <br />rm -rf /dir1/ <br />The above command deletes /dir1/ and every _le and sub-directory that exists inside. <br />30: find . -name foo <br />The above command searches through the current working directory for all _les with "foo" in their <br />name. <br />31: The more command is a "pager" utility used to view text in the terminal window one page or screen <br />at a time. The [Space] bar moves forward one page and [Q] quits. <br />32: cat &lt;filename&gt; | less <br />The above command opens the _le named &lt;filename&gt; using the cat command, but does not <br />allow it to scroll off the screen. <br />33: drwx------ (700) Only the user can read, write in this directory. <br />drwxr-xr-x (755) Everyone can read the directory; users and groups have <br />read and execute permissions. <br />34: gpdf /home/user/PDF/foo.pdf <br />ggv /home/user/PS/bar.ps <br />35: The X Con_guration Tool backs up your system's original video con_guration _le to <br />/etc/X11/XF86Config.backup in case you need it to switch back to a previous con_guration. <br />36: 1. Insert a CD or DVD into the appropriate drive. <br />2. Open a terminal window. <br />3. At the shell prompt, enter the command mount /media/cdrom/. <br />The CD or DVD is now mounted and available for use. You can unmount and eject the CD or DVD <br />by entering the command umount /media/cdrom/. You can then safely press the eject button on <br />your CD or DVD drive to retrieve the disk. <br />37: 1. Open a terminal window. <br />2. Enter the command mount /media/&lt;manufacturer&gt;/. <br />38: You can log in using single-user mode and create a new root password. <br />To enter single-user mode, reboot your computer. If you use the default boot loader, GRUB, you can <br />enter single user mode by performing the following: <br />1. At the boot loader menu, use the arrow keys to highlight the installation you want to edit and <br />type [A] to enter into append mode. <br />2. You are presented with a prompt that looks similar to the following: <br />grub append&gt; ro root=LABEL=/ <br />3. Press the Spacebar once to add a blank space, then add the word single to tell GRUB to boot <br />into single-user Linux mode. The result should look like the following: <br />ro root=LABEL=/ single <br />4. Press [Enter] and GRUB will boot single-user Linux mode. After it _nishes loading, you will <br />be presented with a shell prompt similar to the following: <br />sh-2.05b# <br />5. You can now change the root password by typing <br />passwd root <br />39: If you are not logged in when you realize you have forgotten your password, log in as the root user. <br />Open a shell prompt and enter the command passwd username, where username is your normal <br />user name. The passwd command requires you to enter the new password twice. Log out of your <br />system. You can now log back in with your normal user name and your new password. <br />40: gedit /etc/fstab <br />Add the following on a new line (replacing /dev/hda1 with the Windows partition you found via <br />Hardware Browser): <br />/dev/hda1 /mnt/windows vfat auto,umask=0 0 0 <br />41: type gedit /etc/inittab to edit the _le with gedit. The _le /etc/inittab will open. <br />Within the _rst screen, you will see a section of the _le which looks like this: <br /> Default runlevel. The runlevels used by RHS are: <br /># 0 - halt (Do NOT set initdefault to this) <br /># 1 - Single user mode <br /># 2 - Multiuser, without NFS (The same as 3, if you do not have networking) <br /># 3 - Full multiuser mode <br /># 4 - unused <br /># 5 - X11 <br /># 6 - reboot (Do NOT set initdefault to this) <br />42: . /bin/. Used to store user commands. The directory /usr/bin/ also stores user commands. <br />. /sbin/ . Location of many system commands, such as shutdown. The directory /usr/sbin/ <br />also contains many system commands. <br />. /root/. The home directory of root, the superuser. <br />. /misc/ . This directory is used for automatically mounting directories on removeable devices <br />(such as Zip drives) and remote directories (such as NFS shares) using autofs. Refer to the autofs <br />manual page (type man autofs at a shell prompt) for more information. <br />. /mnt/ . This directory typically contains the mount points for _le systems mounted after the <br />system is booted. <br />. /media/. This directory contains the mount points for removable media, such as diskettes, CDROMs, <br />and USB _ash drives. <br />. /boot/. Contains the kernel and other _les used during system startup. <br />. /lost+found/. Used by fsck to place orphaned _les (_les without names). <br />. /lib/.Contains many device modules and library _les used by programs in /bin/ and /sbin/. <br />The directory /usr/lib/ contains library _les for user applications. <br />. /dev/. Stores device _les. <br />. /etc/. Contains con_guration _les and directories. <br />. /var/. For variable (or constantly changing) _les, such as log _les and the printer spool. <br />. /usr/ . Contains _les and directories directly relating to users of the system, such as programs <br />and supporting library _les. <br />. /proc/ . A virtual _le system (not actually stored on the disk) that contains system information <br />used by certain programs. <br />. /initrd/.A directory that is used to mount the initrd.img image _le and load needed device <br />modules during bootup. <br />Warning <br />Do not delete the /initrd/ directory. You will be unable to boot your computer if you delete the <br />directory and then reboot your Red Hat Enterprise Linux system. <br />. /tftpboot/.Contains _les and applications needed for Preboot Execution Environment (PXE), <br />a service that allows client machines and machines without hard drives to boot an operating system <br />from an image on a central PXE server. <br />. /tmp/.The temporary directory for users and programs. /tmp/ allows all users on a system read <br />and write access. <br />. /home/. Default location of user home directories. <br />. /opt/. Directory where optional _les and programs are stored. This directory is used mainly by <br />third-party developers for easy installation and uninstallation of their software packages. <br /><br />  <br />  <br /> <img src ="http://www.cnitblog.com/charester/aggbug/19250.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cnitblog.com/charester/" target="_blank">天空</a> 2006-11-17 10:20 <a href="http://www.cnitblog.com/charester/archive/2006/11/17/19250.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>FC6下安装Resin＋Apache+Oracle9i</title><link>http://www.cnitblog.com/charester/archive/2006/11/10/19045.html</link><dc:creator>天空</dc:creator><author>天空</author><pubDate>Fri, 10 Nov 2006 06:50:00 GMT</pubDate><guid>http://www.cnitblog.com/charester/archive/2006/11/10/19045.html</guid><wfw:comment>http://www.cnitblog.com/charester/comments/19045.html</wfw:comment><comments>http://www.cnitblog.com/charester/archive/2006/11/10/19045.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cnitblog.com/charester/comments/commentRss/19045.html</wfw:commentRss><trackback:ping>http://www.cnitblog.com/charester/services/trackbacks/19045.html</trackback:ping><description><![CDATA[最近公司要配置如下服务器：<br /><br />正努力配置,调试成功。<br /><br />硬件环境<br /><br />fedora core 6<br /><br />j2sdk-1_4_2_12<br /><br />httpd-2.0.59<br /><br />resin-3.0.19<br /><br /><br />1、查看linux是否已安装 jdk 如果有卸载（java-1.42-gcj-compat ）<br /><br />    下载j2sdk-1_4_2_12-linux-i586.bin<br />    <br />    #chmod 755 j2sdk-1_4_2_12-linux-i586.bin<br />       #./j2sdk-1_4_2_05-linux-i586.bin<br />    <br />2、java环境设置<br />    <br />    #vi /etc/profile<br />    <br />    在文档最后面添加<br /><br />    export JAVA_HOME=/usr/local/j2sdk1.4.2_12<br /><br />    export RESIN_HOME=/usr/local/resin-3.0.19<br /><br />    export CLASSPATH=.:$CLASSPATH:$JAVA_HOME/lib/tools.jar:$JAVA_HOME/lib/dt.jar:RESIN_HOME/lib<br /><br />    export PATH=$PATH:$JAVA_HOME/bin:RESIN_HOME/bin<br /><br />    <br />    #source /etc/profile <br />    <br />3、测试jdk<br />    <br />    #java -version   <br />        <br />        显示版本信息<br />    <br />        #javac <br />    #java <br /><br />    有帮助文档出现就说明jdk安装成功了<br /><br />4、测试resin<br />    <br />    # tar zxvf resin-3.0.13.tar.gz<br />    # cd /usr/local/resin-3.0.19<br />    # /usr/local/resin-3.0.19/bin/httpd.sh start<br />    <br />    测试：http://localhost:8080<br />    <br />    出现Resin® Default Home Page页面就说明rensin运行正常<br />    <br />5、安装openssl<br /><br />        # rpm -ivh openssl097a-0.9.7a-9.i386.rpm<br />        # rpm -ivh openssl-0.9.8b-8.i386.rpm<br />        # rpm -ivh openssl-devel-0.9.8b-8.i386.rpm<br /> <br />5、安装Apache<br />    <br />    # tar zxvf httpd-2.0.59.tar.gz<br />    # cd httpd-2.0.59<br />        <br />        <br />    #./configure --prefix=/usr/local/apache --enable-module=so<br />    # ./configure --prefix=/usr/local/apache --enable-ssl<br />    # make<br />    # make install<br />        <br />    启动apache <br />    <br />    #/usr/local/apache/bin/apachectl start<br />    <br />    测试http://localhost/<br />    <br />       出现默认主页就说明apache安装成功<br />       If you can see this, it means that the installation of the Apache web server software on this system was successful. You may now add content to this directory and replace this page.<br />    <br /><br />6、编译resin<br />    <br />    # cd /usr/local/resin-3.0.19<br />    #./configure --with-apxs=/usr/local/apache/bin/apxs<br />    # make<br />    # make install<br /><br />7、修改配置文件<br /><br />    把/usr/local/resin-3.0.19/conf下的rensin.conf文件中的如下设置改成如下<br />    &lt;web-app id="/" document-directory="/usr/local/apache/htdocs"/&gt;<br />     特别注意的是：一定要执行下面这行<br />    修改host<br />    &lt;cluster&gt;<br />              &lt;srun server-id="" host="192.168.1.11" port="6802"/&gt;<br />        &lt;/cluster&gt;<br />        <br />        其中192.168.1.11为内网IP <br />    <br />        在/usr/local/apache/conf下的httpd.conf中添加<br />    &lt;Location /caucho-status&gt;<br />          SetHandler caucho-status<br />    &lt;/Location&gt;<br /><br />8、启动服务<br />    /usr/local/apache/bin/apachectl restart<br />    /usr/local/resin-3.0.19/bin/httpd.sh restart<br />9、测试<br /><br />    新建test.jsp在apache目录下：htdocs下<br />    <br />    &lt;%@page language="java"%&gt;<br />      2+2=&lt;%=2+2%&gt;<br />    浏览器：http://localhost:8080/test.jsp<br />    <br />    错误信息：如果apache出现空白：<br /><br />    解决办法：更改文件或者文件夹权限<br /><br />************************************************************************<br />应该要注意的：<br /><br />    3.整合Apache和Resin<br />    目的是让Resin的主目录和apache的主目录指向同一个目录,并且配置Resin可以在解析80端口处的JSP网页.<br />    <br />    (1)检查文件<br /><br />       # ls /usr/local/apache/modules/mod_caucho.so<br />       如果有,继续<br /><br />       (2)编辑httpd.conf<br /><br />       # vi /usr/local/apache/conf/httpd.conf<br />       找到ResinConfigServer localhost 6802<br />    确信其内容为:<br />       LoadModule caucho_module /usr/local/apache/modules/mod_caucho.so<br />       ResinConfigServer 192.168.1.11 6802  //即改localhost为你的计算机的实际IP<br />       CauchoStatus yes<br /><br />       (3)编辑resin.conf<br /><br />       # vi /usr/local/resin-3.0.19/conf/resin.conf<br />       将&lt;http...&gt;和&lt;srun...&gt;的host改成实际IP:<br />       &lt;http server-id="" host="192.168.1.11" port="8080"/&gt;<br />       ...<br />       &lt;srun server-id="" host="192.168.1.11" port="6802" index="1"/&gt;<br /><br />       (4)重启apache和resin<br /><br />       # /usr/local/apache/bin/apachectl restart<br />       # /usr/local/resin-3.0.19/bin/httpd.sh start<br />       如果出现端口被占,无法绑定的情况,则重启系统,# reboot<br /><br />       (5)测试<br /><br />       将test.jsp文件:<br />       2+2=&lt;%=2+2%&gt;<br />       放到目录apache/htdocs中<br />       访问:<br />       http://localhost/test.jsp<br />       如能正常显示2+2=4,则说明成功.<br /><br />*************************************************************************    <br />错误信息：<br /><br />    httpd: Could not determine the server's fully qualified domain name, using 192.168.1.11 for ServerName<br />    (98)Address already in use: make_sock: could not bind to address [::]:80<br />    no listening sockets available, shutting down<br />    Unable to open logs<br /><br />    解决方法：查找httpd.conf<br />    取消注释：#ServerName www.example.com:80<br />    reboot<br />    重新启动<br /><br /><br />    再进行测试<br />    在htdocs下新建test.html<br />    &lt;html&gt;&lt;body&gt;hello&lt;/body&gt;&lt;/html&gt;<br /><br />    http://localhost/test.html<br /><br />    错误信息：<br />    Forbidden<br /><br />    You don't have permission to access /test.html on this server.<br />    Apache/2.0.59 (Unix) mod_ssl/2.0.59 OpenSSL/0.9.8b Server at localhost Port 80<br /><br />    解决：选中改文件修改可执行权限<br /><br />参考资料：<br />1：整合Apache2/Resin/MySQL<br /><a href="http://kb.discuz.net/index.php?title=%E6%95%B4%E5%90%88Apache2/Resin/MySQL">http://kb.discuz.net/index.php?title=%E6%95%B4%E5%90%88Apache2/Resin/MySQL</a><br />2：Resin with Apache<br /><a href="http://caucho.rz.klopotek.de/resin-3.1/doc/install-apache.xtp#standalone">http://caucho.rz.klopotek.de/resin-3.1/doc/install-apache.xtp#standalone</a><br />3：Resin官方中文资料<br /><a href="http://www.unlinux.com/doc/apache/20051027/3269.html">http://www.unlinux.com/doc/apache/20051027/3269.html</a><br />4：apache 1.3.26+resin 2.1.4在linux下面的整合安装<br /><a href="http://www.unlinux.com/doc/apache/20051027/2674.html">http://www.unlinux.com/doc/apache/20051027/2674.html</a><br />5：apache+resin安装步骤共享<br /><a href="http://www.unlinux.com/doc/apache/20051027/2696.html">http://www.unlinux.com/doc/apache/20051027/2696.html</a><br />6：Apache+resin整合<br /><a href="http://blog.sina.com.cn/u/47243df30100023h">http://blog.sina.com.cn/u/47243df30100023h</a><br />7：apache+resin的安装步骤<br /><a href="http://publish.it168.com/2005/0918/20050918029501.shtml">http://publish.it168.com/2005/0918/20050918029501.shtml</a><br />8：apache学习笔记一（安装apache2+php+resin）<br /><a href="http://chinaunix.net/jh/13/123634.html">http://chinaunix.net/jh/13/123634.html</a><br />9： Apache 手册大全<br /><a href="http://w.yi.org/ftp/FAPM/">http://w.yi.org/ftp/FAPM/</a><br />10：<span style="FONT-SIZE: 13px">Apache 2.2 官方手册中文版</span><span style="FONT-SIZE: 13px"><br />电信：<a href="http://lamp.linux.gov.cn/Apache/ApacheMenu/index.html">http://lamp.linux.gov.cn/Apache/ApacheMenu/index.html</a><br />网通：<a href="http://www.dogdoghome.com/lamp/Apache/ApacheMenu/index.html">http://www.dogdoghome.com/lamp/Apache/ApacheMenu/index.html</a><br />11： </span>架设某大型网站服务器之全部过程<br /><a href="http://blog.chinaunix.net/u/4764/showart_161964.html">http://blog.chinaunix.net/u/4764/showart_161964.html</a><br />12：Apache与Resin组合暴露源代码的分析及解决方案<br /><a href="http://bbs.chinaunix.net/viewthread.php?tid=571500&amp;fpage=1&amp;highlight">http://bbs.chinaunix.net/viewthread.php?tid=571500&amp;fpage=1&amp;highlight</a>=<br />13：apache+resin安装步骤共享<br /><a href="http://bbs.chinaunix.net/viewthread.php?tid=16108">http://bbs.chinaunix.net/viewthread.php?tid=16108</a><br />14：apache+resin+mysql 整和之道<br /><a href="http://bbs.chinaunix.net/viewthread.php?tid=529484">http://bbs.chinaunix.net/viewthread.php?tid=529484</a><br />15：Resin + Apache 暴露JSP源代码问题的解决方案（二）<br /><a href="http://bbs.chinaunix.net/viewthread.php?tid=719532">http://bbs.chinaunix.net/viewthread.php?tid=719532</a><br />16：Apache+Resin+MySQL整合的几个要点<br /><a href="http://blog.chinaunix.net/u/13797/showart_160242.html">http://blog.chinaunix.net/u/13797/showart_160242.html</a><br /><font color="#000000"><font size="3"><br /></font><br /></font><img src ="http://www.cnitblog.com/charester/aggbug/19045.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cnitblog.com/charester/" target="_blank">天空</a> 2006-11-10 14:50 <a href="http://www.cnitblog.com/charester/archive/2006/11/10/19045.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>