﻿<?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>BlogJava-weidagang2046的专栏-文章分类-Linux</title><link>http://www.blogjava.net/weidagang2046/category/1069.html</link><description>物格而后知致</description><language>zh-cn</language><lastBuildDate>Wed, 28 Feb 2007 08:21:02 GMT</lastBuildDate><pubDate>Wed, 28 Feb 2007 08:21:02 GMT</pubDate><ttl>60</ttl><item><title>wget——Linux下Web文件提取工具</title><link>http://www.blogjava.net/weidagang2046/articles/81685.html</link><dc:creator>weidagang2046</dc:creator><author>weidagang2046</author><pubDate>Fri, 17 Nov 2006 01:56:00 GMT</pubDate><guid>http://www.blogjava.net/weidagang2046/articles/81685.html</guid><wfw:comment>http://www.blogjava.net/weidagang2046/comments/81685.html</wfw:comment><comments>http://www.blogjava.net/weidagang2046/articles/81685.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/weidagang2046/comments/commentRss/81685.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/weidagang2046/services/trackbacks/81685.html</trackback:ping><description><![CDATA[
		<font color="#cccccc">
				<font color="#000000">wget是一个Linux环境下用于从World Wide Web上提取文件的工具，这是一个GPL许可 <br />证下的自由软件，其作者为Hrvoje Niksic &lt;hniksic@srce.hr&gt;。wget支持HTTP和FTP <br />协议，支持代理服务器和断点续传功能，能够自动递归远程主机的目录，找到合乎条 <br />件的文件并将其下载到本地硬盘上；如果必要，wget将恰当地转换页面中的超级连接 <br />以在本地生成可浏览的镜像。由于没有交互式界面，wget可在后台运行，截获并忽略 <br />HANGUP信号，因此在用户推出登录以后，仍可继续运行。通常，wget用于成批量地下 <br />载Internet网站上的文件，或制作远程网站的镜像。 <br /><br />语法: <br /><br />    wget [options] [URL-list] <br />URL地址格式说明:可以使用如下格式的URL: <br />    http://host[:port]/path <br />例如: <br />    http://fly.cc.fer.hr/ <br />    ftp://ftp.xemacs.org/pub/xemacs/xemacs-19.14.tar.gz <br />    ftp://username:password@host/dir/file  <br />在最后一种形式中，以URL编码形式为FTP主机提供了用户名和密码（当然，也可以使 <br />用参数提供该信息，见后）。 <br /><br />参数说明： <br /><br />wget的参数较多，但大部分应用只需要如下几个常用的参数： <br />    -r    递归；对于HTTP主机，wget首先下载URL指定的文件，然后（如果该文件是 <br />    一个HTML文档的话）递归下载该文件所引用（超级连接）的所有文件（递归深度 <br />    由参数-l指定）。对FTP主机，该参数意味着要下载URL指定的目录中的所有文件， <br />    递归方法与HTTP主机类似。 <br /><br />    -N    时间戳：该参数指定wget只下载更新的文件，也就是说，与本地目录中的对 <br />    应文件的长度和最后修改日期一样的文件将不被下载。 <br /><br />    -m    镜像：相当于同时使用-r和-N参数。 <br /><br />    -l    设置递归级数；默认为5。-l1相当于不递归；-l0为无穷递归；注意，当递 <br />    归深度增加时，文件数量将呈指数级增长。 <br /><br />    -t     设置重试次数。当连接中断（或超时）时，wget将试图重新连接。如果指 <br />    定-t0，则重试次数设为无穷多。 <br /><br />    -c    指定断点续传功能。实际上，wget默认具有断点续传功能，只有当你使用别 <br />    的ftp工具下载了某一文件的一部分，并希望wget接着完成此工作的时候，才需要 <br />    指定此参数。 <br /><br />使用举例： <br />    wget -m -l4 -t0 http://oneweb.com.cn/ <br />将在本地硬盘建立http://oneweb.com.cn/的镜像，镜像文件存入当前目录下一个名为 <br />oneweb.com.cn的子目录中（你也可以使用-nH参数指定不建立该子目录，而直接在当前 <br />目录下建立镜像的目录结构），递归深度为4，重试次数为无穷（若连接出现问题， <br />wget将坚韧不拔地永远重试下去，知道任务完成！） <br /><br />另外一些使用频率稍低的参数如下： <br />    -A acclist / -R rejlist： <br />这两个参数用于指定wget接受或排除的文件扩展名，多个名称之间用逗号隔开。例如， <br />假设我们不想下载MPEG视频影像文件和.AU声音文件，可使用如下参数： <br />    -R mpg,mpeg,au <br /><br />其它参数还有： <br />    -L     只扩展相对连接，该参数对于抓取指定站点很有用，可以避免向宿主主机 <br />    的其他目录扩散。例如，某个人网站地址为：http://www.xys.org/~ppfl/，使用 <br />    如下命令行： <br />    wget -L http://www.xys.org/~ppfl/ <br />    则只提取该个人网站，而不涉及主机www.xys.org上的其他目录。 <br /><br />    -k    转换连接：HTML文件存盘时，将其中的非相对连接转换成为相对连接。 <br /><br />    -X    在下载FTP主机上的文件时，排除若干指定的目录 <br /><br />另外，下面参数用于设置wget的工作界面： <br />    -v    设置wget输出详细的工作信息。 <br />    -q    设置wget不输出任何信息。 <br /><br />如果我们已经在一个HTML文档（或普通文本文档）中存储了所要提取的文件的连接， <br />可以让wget直接从该文件中提取信息，而不用在命令行中提供URL地址，参数格式为： <br />    -i filename <br />地址文件也可以不是HTML文档，例如，一个普通的文本文件，其中有需要下载的URL列 <br />表即可。 <br />我们可以用以下技巧提高下载速度：由于Linux是一个多任务系统，我们可以同时运行 <br />多个wget进程以提高下载速度，例如，先下载某主页文件（index.html），然后将该 <br />文件所列出的所有地址分别用一个独立的wget进程进行下载。 <br /><br />至于其他的参数，可参考wget的man手册页，命令为： <br />    man wget</font>
				<br />
				<br />from: <a href="http://fanqiang.chinaunix.net/a6/b9/20020514/060201225.html">http://fanqiang.chinaunix.net/a6/b9/20020514/060201225.html</a></font>
<img src ="http://www.blogjava.net/weidagang2046/aggbug/81685.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/weidagang2046/" target="_blank">weidagang2046</a> 2006-11-17 09:56 <a href="http://www.blogjava.net/weidagang2046/articles/81685.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>EMACS在windows下的配置 </title><link>http://www.blogjava.net/weidagang2046/articles/61078.html</link><dc:creator>weidagang2046</dc:creator><author>weidagang2046</author><pubDate>Mon, 31 Jul 2006 12:17:00 GMT</pubDate><guid>http://www.blogjava.net/weidagang2046/articles/61078.html</guid><wfw:comment>http://www.blogjava.net/weidagang2046/comments/61078.html</wfw:comment><comments>http://www.blogjava.net/weidagang2046/articles/61078.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/weidagang2046/comments/commentRss/61078.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/weidagang2046/services/trackbacks/61078.html</trackback:ping><description><![CDATA[
		<div class="storycontent" id="article_main" style="CLEAR: both">EMACS在windows环境下关于HOME目录设置和中文环境设置的问题和方法 <br />Emacs 的配置文件是一个叫 <font color="#ff0000">.emacs</font> 的文件，不<br />知道 M$ 哪两个部门的沟通出了点问题，导致 windows explorer 无<br />法直接创建 ^.* 这样的 文件（而这样的文件名在windows文件系统中<br />却又是合法的，啧啧）， 所以 ，在windows下也可以 用<br /><font color="#ff0000">_emacs</font> 来代替。<br /><br />下一步，让emacs找到你的 .emacs 配置文件，如果你什么都懒得做，<br />就直接仍到 <font color="#ff0000">C:/ </font>下面好了。<font color="#0000ff"><br />但是我最强烈 的推荐大家，稍微多做一点点工作，以便以后工作的更好</font>。设置一个“主目录”，这个目录通常就是<br /><br />c:/Documentsand Settings/Administrator<br /><br />你也可以设置能其它目录，以方便重装系统的时候备份。<br /><br />设置主目录有两种方法<br /><br />1. 新建一个名字叫 <font color="#008000">HOME</font> 的环境变量。变量<br />值就是你的想要的目录路径名称。<br /><br />2. 如果你觉得第一种方法不过瘾，想让 Windowz 最强大的注册表发<br />挥一下功能，也可以。新建一个数据项<br /><br /><font color="#008000">HKEY_CURRENT_USERSoftwareGNUEmacs</font><br /><br />在里面添加一个 REG_SZ 类型的字符串，名字就叫<br /><font color="#008000">HOME</font>, 值就是你想要的目录路径名。<br /><br />设置好主目录后，把 .emacs(_emacs) 扔进去。最基本的设置就算完<br />成了。<br /><br />3. 中文支持<br /><br />Emacs 是一个真正的支持多语言编辑器。试试看<br /><br />M-x view-hello-file<br /><br />会列出Emacs支持的所有语言。如果有些大方块在里面，那不是<br />Emacs 的错，因为你的系统里没有那种字体。<br /><br />如果你下载的是那个 CVS Emacs,据说默认就支持中文了。如果是21.3<br />，可能需要一点配置。<br /><br />打开 .emacs(_emacs) 文件，你现在还不会用 Emacs, 所以还是先用<br />notepad, ue， editplus 等你熟悉的编辑器吧。<br /><br />注意：<font color="#008000">绿色</font>部分为代码，直接copy过去就可以，'';''开头的行，是<br />elisp的注释行，但愿你的编辑器已经支持它了。<br /><br />加入以下几行。<br /><font color="#008000"><br />(set-terminal-coding-system ''chinese-iso-8bit)<br />(set-keyboard-coding-system ''chinese-iso-8bit)<br />(set-language-environment ''chinese-gb)<br />(set-clipboard-coding-system ''chinese-iso-8bit)<br />(set-selection-coding-system ''chinese-iso-8bit)<br />(setq locale-coding-system ''chinese-iso-8bit)<br />(setq current-language-environment "Chinese-GB")</font><br />启动emacs, 试着敲几个中文，应该不会有问题了。 <br style="CLEAR: both" /><br />from: <a href="http://deanxx.bloghome.cn/posts/940">http://deanxx.bloghome.cn/posts/940</a></div>
<img src ="http://www.blogjava.net/weidagang2046/aggbug/61078.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/weidagang2046/" target="_blank">weidagang2046</a> 2006-07-31 20:17 <a href="http://www.blogjava.net/weidagang2046/articles/61078.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Emacs buffer和window相关问题</title><link>http://www.blogjava.net/weidagang2046/articles/61000.html</link><dc:creator>weidagang2046</dc:creator><author>weidagang2046</author><pubDate>Mon, 31 Jul 2006 05:22:00 GMT</pubDate><guid>http://www.blogjava.net/weidagang2046/articles/61000.html</guid><wfw:comment>http://www.blogjava.net/weidagang2046/comments/61000.html</wfw:comment><comments>http://www.blogjava.net/weidagang2046/articles/61000.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/weidagang2046/comments/commentRss/61000.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/weidagang2046/services/trackbacks/61000.html</trackback:ping><description><![CDATA[怎么才能知道Emacs中活动buffer的数量？有三种方法：buffer列表（键入C-x C-b时显示在一窗口中），Buffers菜单（它列出了活动的buffer和浏览这些buffer的命令），还有Buffer弹出菜单（按住Ctrl，单击鼠标左键访问，它根据模式列出buffer）。<br /><br />Emacs会创建它自己的专用buffer。这些内部buffer的名字一般来说格式为 *buffer name* 。*Help*、*scratch*和*Buffer List*就是Emacs创建的其中一些buffer。<br /><br />当你启动Emacs时，它会建立两个buffer：<br /><br />*Messages*<br />*scratch*<br /><br />*Messages* buffer存储了Emacs收集自它启动时从minibuffer里显示的消息；*scratch*是个临时的scratchpad（涂鸦板），以便你有地方输入东西。除非你使用C-x C-w明确的把它写到文件中，否则它不会被保存下来。<br /><br />当然，一般来说你用Emacs编辑文件时，这些文件就会被拷贝到同名的buffer中。如果你需要获得帮助，则会进入 *Help* buffer。<br /><br />能在Emacs里打开的buffer数量实际上没有限制。大多数情况下，只显示一个或两个buffer；不过即使你无法看到全部，你在某个Emacs会话里创建的buffer仍处于活动状态。你可以把这些buffer想象成一叠纸，只有放在最上面的那页才显示在你眼前。不过任何时候，你都可以翻到另一页（另一个buffer），或者也可以创建一个新页。<br /><br />每个buffer都关联一个主模式（major mode），它决定了Emacs在这个buffer里的行为。例如，设计用来书写文本的文本模式（text mode），和Lisp模式的表现就不一样，后者被设计用来编写Lisp程序。<br /><br /><span style="FONT-WEIGHT: bold">如何操作多个buffer</span><br /><br />如果要新建包含一个文件的buffer，只需键入 C-x C-f 找到该文件。Emacs就会自动新建一个buffer并定位到该buffer。如果该文件已打开，C-x C-f 只是定位到已有buffer中，这一点很有意义，可以避免同一文件存在多个buffer导致混乱。如果键入 C-x C-f 后输入的文件名不存在，Emacs认为你想新建一个文件，并定位到一个空白buffer中。<br /><br />C-x b：在多个buffer之间进行切换；键入命令后输入buffer名，回车。如果已存在该buffer，则切换到该buffer中；否则以输入的buffer名新建一个buffer，但是注意这个buffer并没有和文件相关，因此关闭Emacs，它不会给你任何提示。<br /><br />C-mouse 1：按住Ctrl并单击鼠标左键，会弹出一个Buffer Menu，它会按主模式类型列出活动的buffer供你选择。<br /><br />C-x -&gt;(&lt;-)：按下C-x后（放开）再按向右（左）方向键可以定位到下（上）一个buffer中。<br /><br /><span style="FONT-WEIGHT: bold">如何删除buffer</span><br /><br />注意：如果你修改了一个buffer（且该buffer和一个文件相关），则Emacs会在删除buffer前询问你是否保存所做修改；如果这个buffer和文件不相关，则你在该buffer里所做任何修改都会丢失，Emacs认为你不在乎这些buffer因此不作任何提示。因此编辑重要的buffer之前最好先 C-x C-w 写到文件中，或者用 C-x C-f 新建buffer。<br /><br />C-x k：kill-buffer命令，删除一个buffer；<br /><br />M-x kill-some-buffers：删除一些buffer；<br /><br />如果删除了当前会话里的所有buffer，Emacs会新建一个 *scratch* buffer，总得有个东西显示在屏幕上不是？:P<br /><br /><span style="FONT-WEIGHT: bold">如何保存buffer</span><br /><br />C-x C-s：保存当前buffer；<br /><br />C-x s：即save-some-buffers命令，一次保存所有buffer；<br /><br /><span style="FONT-WEIGHT: bold">如何重命名buffer</span><br /><br />M-x rename-buffer：重命名buffer；<br /><br /><span style="FONT-WEIGHT: bold">如何使buffer只读</span><br /><br />C-x C-q：切换buffer的read-only和read-write状态；<br /><br /><span style="FONT-WEIGHT: bold">buffer和window的关系</span><br /><br />buffer和window并不是一一对应的，同一个buffer可以有多个window，比如你可以同时在多个window里查看同一buffer的不同部分。Mark是和buffer关联的；而point是和window关联的。<br /><br />C-x 2：即split-window-vertically命令，水平切分窗口；<br /><br />C-x 3：垂直切分窗口；<br /><br />C-x 4 b(f)：在另一个窗口选择另一个buffer（查找另一个文件），这样你可以不用切换到另一个window，就改变其buffer或打开文件；<br /><br />C-M-v：滚动另一个window（C-v是滚动当前window）；<br /><br />C-x o：此处 o 表示other（其它），移动光标到另一个window；<br /><br />C-x 0：删除当前所在的window；<br /><br />C-x 1：删除当前所在window之外的所有window；<br /><br />C-x 5 2：新建一个frame；<br /><br />from: <a href="http://blog.donews.com/leal/archive/2005/10/18/592725.aspx">http://blog.donews.com/leal/archive/2005/10/18/592725.aspx</a><img src ="http://www.blogjava.net/weidagang2046/aggbug/61000.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/weidagang2046/" target="_blank">weidagang2046</a> 2006-07-31 13:22 <a href="http://www.blogjava.net/weidagang2046/articles/61000.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Debugging with GDB （入门篇）</title><link>http://www.blogjava.net/weidagang2046/articles/60913.html</link><dc:creator>weidagang2046</dc:creator><author>weidagang2046</author><pubDate>Sun, 30 Jul 2006 15:45:00 GMT</pubDate><guid>http://www.blogjava.net/weidagang2046/articles/60913.html</guid><wfw:comment>http://www.blogjava.net/weidagang2046/comments/60913.html</wfw:comment><comments>http://www.blogjava.net/weidagang2046/articles/60913.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/weidagang2046/comments/commentRss/60913.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/weidagang2046/services/trackbacks/60913.html</trackback:ping><description><![CDATA[
		<dd>Debug 是大家常常用到的东西.不管是自己写程式也好,还是想改改别人写好的东西, 又或者帮人家捉捉虫.总之呢,绝对是个常常用的到的东西.Dos, windows 底下,通常大家都在用 softice. 这里我就不介绍了,因为在前面的 "学习程式"中的"Assembly"里面已经有了很详细的介绍了.这里我来说说 linux 底下的 GDB 吧. 
<p></p></dd>
		<dd>GDB 的全称是 GNU Debuger. 是 linux 底下的一种免费的 debug 程式.随然介面不像 SoftIce 那麽好,但是功能也绝对强大.要使用 gdb 那麽首先,在你 compile 程式的时候, 要加上 -g 的选项. （可以用-g, -g2, -g3具体请看 man gcc）通常如果程式不会很大,在 compile 的时候我都是用 -g3 的,因为如果你用到了 inline 的 function, 用 -g 去 compile 就无法去 debug inline function了.这时候就用到 -g2, -g3了,g後面的数字越大,也就是说可以 debug 的级别越高.最高级别就是 -g3. 
<p></p></dd>
		<dd>既然是入门篇,就从最简单的来做啦.先写个小程式,我们用来学习 gdb. 用你喜爱的 editor 编辑一个叫做 test.c 的文件,内容如下∶ 
<p></p><pre>int main()
{
	int a, b, c;
	a=5;
	b=10;
	b+=a;
	c=b+a;
	return 0;
}

然後用下面的指令去编辑这个程式∶

gcc -Wall -g -o test test.c

这样 gcc 就会 compile 一个叫做 test 的小程式.现在我们来用 gdb 看看这个小程式∶

gdb -q test

(gdb) l			(这里用 l 指令,是 list 的简写）

1       int main()
2       {
3               int a, b, c;
4               a=5;
5               b=10;
6               b+=a;
7               c=b+a;
8               return 0;
9       }

（这时候你就可以看到程式的 source 了）


我们现在下一个 breakpoint,这个 breakpoint 将会在第二行,也就是 2 { 这里.
这样程式运行完 int main()以後,就会停下来.

(gdb) b 2	(b 就是 breakpoint 的简写啦)
Breakpoint 1 at 0x80483a0: file test.c, line 2. 

现在来运行这个程式

(gdb) r		(r是 run 的简写)
Starting program: /home/goldencat/study-area/goldencat/gdb/test 

Breakpoint 1, main () at test.c:2
2       {
程式运行到这里,就停下来了.因为我们在这里设下了 breakpoint.
(gdb)n		(n = next)
main () at test.c:4
4               a=5; (这里就跑到了第四行了)
(gdb) n
5               b=10;
(gdb) n
6               b+=a;
(gdb) n
7               c=b+a;
这时候我们来看看 b 的 value 是多少∶

(gdb) p b	(p是print的简写,这里实际写成print b)
$1 = 15		(这里显示的就是 b 的 value, 以後要看 b, 直接用 p $1 也是一样的)
		(这里的 $1 就是指向 b 的)

(gdb) n
8               return 0;
(gdb) p c
$2 = 20		(这里看到 c 的 value 是 20)
(gdb) c		(c 是 continue 的意思,也就是说执行到程式的结束)
Continuing.

Program exited normally.
(gdb) q		(这就结束 gdb 了 )
</pre></dd>
		<dd>跟 n (next) 不同的,还有一个用法就是 step. step 很有用的就是,当你追到一个call 的时候,（如 my_function(value1)）如果用 next 会只接跑过这个 call,而不会跑到这个 call里面, step 就不同了. step 会跑到这个 call 的里面去,让你能追到 call 里面. 
<p></p></dd>
		<dd>这里在顺便说说如何改变一个 value. 当你下指令 p 的时候,例如你用 p b, 这时候你会看到 b 的 value, 也就是上面的 $1 = 15. 你也同样可以用 p 来改变一个 value, 例如下指令 p b = 100 试试看,这时候你会发现, b 的 value 就变成 100 了∶$1 = 100. 
<p></p></dd>
		<dd>利用display这个命令,你可以在每一次的 next 时,都显示其中一个的 value,看看下面的范例也许容易明白些∶ 
<p></p><pre>[goldencat@goldencat gdb]$ gdb -q test
(gdb) l 
1       int main()
2       {
3               int a, b, c;
4               a=5;
5               b=10;
6               b+=a;
7               c=b+a;
8               return 0;
9       }
(gdb) b 2
Breakpoint 1 at 0x80483a0: file test.c, line 2.
(gdb) r
Starting program: /home/goldencat/study-area/goldencat/gdb/test 

Breakpoint 1, main () at test.c:2
2       {
(gdb) n
main () at test.c:4
4               a=5;
(gdb) display a		(set display on)
1: a = 134517840
(gdb) n
5               b=10;
1: a = 5		(display a)
(gdb) n
6               b+=a;
1: a = 5		(display a)
(gdb) n
7               c=b+a;
1: a = 5		(display a)
(gdb) n
8               return 0;
1: a = 5		(display a)
(gdb) c
Continuing.

Program exited normally.
(gdb) q
</pre></dd>
		<dd>当然你要 display 多少个 value 并没有甚麽限制.你完全可以把 a, b, c全部都display出来. 利用 info 这个指令,你可以看到目前的状况.如∶ info display 就能看到目前的display 的状况∶ 
<p></p><pre>(gdb) info display
Auto-display expressions now in effect:
Num Enb Expression
1:   y  b	（这里的 y 就是说, display b 是 enable 的)

用 info break 就可以看到 breakpoint 的状况∶

(gdb) info break
Num Type           Disp Enb Address    What
1   breakpoint     keep y   0x080483a0 in main at test.c:2
        breakpoint already hit 1 time
(gdb) 

	利用 disable 和 enable 命令,可以赞时开启和这关闭一些命令.例如∶

(gdb) disable display 1
(gdb) info display
Auto-display expressions now in effect:
Num Enb Expression
1:   n  b		(这里看到个 n, 也就是说, display b 已经被关闭了)
(gdb) 			


(gdb) disable break 1
(gdb) info break
Num Type           Disp Enb Address    What
1   breakpoint     keep n   0x080483a0 in main at test.c:2
        breakpoint already hit 1 time
(gdb) 		(这里看到,breakpoint也被用 disable break 1 给关闭了)
</pre></dd>
		<dd>如果你问我为甚麽要用 1 (disable break/display 1),看看上面的 Num 那几个字就知道了. 这里的 1 就是说关闭第一个 value. 因为当你真正 debug 的是侯,可能有很多的 break,你只要关闭你想要关闭的就好了,看看下面∶ 
<p></p><pre>(gdb) info display
Auto-display expressions now in effect:
Num Enb Expression
3:   y  c
2:   y  b
1:   y  a
</pre></dd>
		<dd>这里 display 中有三个 value, 现在我想赞时关闭对 b 的 display,可以从 Num 看出, b 的 Num 是 2,所以我们要用 disable display 2 
<p></p><pre>(gdb) disable display 2
(gdb) info display
Auto-display expressions now in effect:
Num Enb Expression
3:   y  c
2:   n  b		(这里看到, b 已经关闭了)
1:   y  a
</pre></dd>
		<dd>如果你用 disable display 而後面没有任何的 number 的话,那麽就是 disable all 的意思∶ 
<p></p><pre>(gdb) disable display  
(gdb) info display
Auto-display expressions now in effect:
Num Enb Expression
3:   n  c
2:   n  b
1:   n  a
(gdb) 
</pre></dd>
		<dd>接下来说说 enable 吧, 知道了 disable, enable 就简单多了. enable 就是跟 disable 相反的意思.也就是说重新开启被关闭的东西.用法跟 disable 一样. 
<p></p><pre>(gdb) enable display 2
(gdb) info display
Auto-display expressions now in effect:
Num Enb Expression
3:   n  c
2:   y  b
1:   n  a
(gdb) enable display
(gdb) info display
Auto-display expressions now in effect:
Num Enb Expression
3:   y  c
2:   y  b
1:   y  a
(gdb) 
</pre></dd>
		<dd>再来讲讲 delete 的用法啦. delete 跟 disable 不太一样,一旦被 delete, 那麽是没有办法用 enable 之类的东西找回来的.假设你 disable 一个 breakpoint,那麽就是说,你赞时不需要用到这个 break point,当你要用到的时候,只要 enable 就好.可是如果你去 delete 一个 breakpoint.就是说你将用远不需要这个 breakpoint 了.如果你下次还需要, 那麽你就给重新用 break 指令去下 breakpoint 了. 
<p></p><pre>(gdb) delete display 1
(gdb) info display
Auto-display expressions now in effect:
Num Enb Expression
3:   y  c
2:   y  b		(1 消失了)
(gdb) delete display	(全部 delete )
Delete all auto-display expressions? (y or n) y		(要求确定一下)
(gdb) info display
There are no auto-display expressions now.	(全部的 display 都被 delete 了)
(gdb) 
</pre></dd>
		<dd>顺便说说如何去 debug 一个已经在 run 的程式∶<br />利用 attach process-id 和 detach 就可以去 debug 一个已经在 run 的程式了. 
<p></p><pre>先用 ps aux 找出你要 debug 的程式的 process it.

[goldencat@goldencat gdb]$ ps aux | grep ssh
root       600  0.0  0.0  2248    0 ?        SW   11:13   0:00 [sshd]
goldenca  1182  0.0  0.7  2448  188 tty2     S    11:40   0:00 ssh 127.0.0.1
goldenca  2802  0.0  1.9  1904  528 pts/1    S    13:45   0:00 grep ssh

这里我们去 debug ssh 127.0.0.1 这个程式,这这程式的 process id 是 1182

[root@goldencat /root]# gdb -q		进入gdb

(gdb) attach 1182			截入 process 1182 到 gdb 里面
Attaching to Pid 1182
0x401b615e in ?? ()
......
......
......					进行 debug
......
......

(gdb) detach				debug 完毕以後,记得要用 detach 这个命令
Detaching from program: , Pid 1182	这个命令就把刚刚 debug 的那个程式 release
(gdb) q					掉了.
</pre><p></p></dd>
		<dd>好啦,入门篇嘛,就写这麽多了.我写的慢,这些就写了我一个早上啦.不敢说能教了大家甚麽东西,但也算是给没有玩过的人一个入门的概念啦.简单的,常用到的break,print, display,disable,enable,delete,run,next,step,continue好像也都说到了. 如果你有心想学,可以看看 man gdb 和进入 gdb 後,用 help 指令. GDB 里面的 help 是很好用的. 
<p></p></dd>
		<dd>如果你是个 debug 的高手,那麽希望你也能抽点时间,跟大家分享一下你的心得.独乐乐不如众乐乐嘛. ∶） 
<p></p><pre>下面是个如何使用 gdb 中的 help 的范例∶


[goldencat@goldencat gdb]$ gdb -q
(gdb) help
List of classes of commands:

aliases -- Aliases of other commands
breakpoints -- Making program stop at certain points
data -- Examining data
files -- Specifying and examining files
internals -- Maintenance commands
obscure -- Obscure features
running -- Running the program
stack -- Examining the stack
status -- Status inquiries
support -- Support facilities
tracepoints -- Tracing of program execution without stopping the program
user-defined -- User-defined commands

Type "help" followed by a class name for a list of commands in that class.
Type "help" followed by command name for full documentation.
Command name abbreviations are allowed if unambiguous.
(gdb) help breakpoints
Making program stop at certain points.

List of commands:

awatch -- Set a watchpoint for an expression
break -- Set breakpoint at specified line or function
catch -- Set catchpoints to catch events
clear -- Clear breakpoint at specified line or function
commands -- Set commands to be executed when a breakpoint is hit
condition -- Specify breakpoint number N to break only if COND is true
delete -- Delete some breakpoints or auto-display expressions
disable -- Disable some breakpoints
enable -- Enable some breakpoints
hbreak -- Set a hardware assisted  breakpoint
ignore -- Set ignore-count of breakpoint number N to COUNT
rbreak -- Set a breakpoint for all functions matching REGEXP
rwatch -- Set a read watchpoint for an expression
tbreak -- Set a temporary breakpoint
tcatch -- Set temporary catchpoints to catch events
thbreak -- Set a temporary hardware assisted breakpoint
txbreak -- Set temporary breakpoint at procedure exit
watch -- Set a watchpoint for an expression
xbreak -- Set breakpoint at procedure exit

Type "help" followed by command name for full documentation.
Command name abbreviations are allowed if unambiguous.
(gdb) help clear
Clear breakpoint at specified line or function.
Argument may be line number, function name, or "*" and an address.
If line number is specified, all breakpoints in that line are cleared.
If function is specified, breakpoints at beginning of function are cleared.
If an address is specified, breakpoints at that address are cleared.

With no argument, clears all breakpoints in the line that the selected frame
is executing in.

See also the "delete" command which clears breakpoints by number.
(gdb) q<br /><br />from: <a href="http://blog.chinaunix.net/u/9483/showart.php?id=57476">http://blog.chinaunix.net/u/9483/showart.php?id=57476</a><br /></pre></dd>
<img src ="http://www.blogjava.net/weidagang2046/aggbug/60913.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/weidagang2046/" target="_blank">weidagang2046</a> 2006-07-30 23:45 <a href="http://www.blogjava.net/weidagang2046/articles/60913.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Linux下的开发工具Emacs介绍 </title><link>http://www.blogjava.net/weidagang2046/articles/60865.html</link><dc:creator>weidagang2046</dc:creator><author>weidagang2046</author><pubDate>Sun, 30 Jul 2006 07:56:00 GMT</pubDate><guid>http://www.blogjava.net/weidagang2046/articles/60865.html</guid><wfw:comment>http://www.blogjava.net/weidagang2046/comments/60865.html</wfw:comment><comments>http://www.blogjava.net/weidagang2046/articles/60865.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/weidagang2046/comments/commentRss/60865.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/weidagang2046/services/trackbacks/60865.html</trackback:ping><description><![CDATA[
		<div class="content">
				<p>使用Linux已经有一段时间了，现在Linux已经成为我办公、学习、娱乐不可缺少的平台。Office系列软件，网络工具，开发软件，这些在Windows下标价昂贵的东西，在Linux下不仅可以免费获取，而且还可以浏览源码观其内幕，附加价值是相当可观的。</p>
				<p>作为一名开发人员，选择一个好的IDE是必要的。在Linux环境下，可考虑选择Eclipse。它的界面友好，编辑、调试、代码管理功能兼备。不过本文介绍的是另一款功能卓绝的开发工具：Emacs。</p>
				<p>Eclispe比较适合初级开发人员，而Emacs则比较适合高级开发人员。功能方面两者相当，或者Emacs略胜一筹。相比Eclipse华贵的界面，Emacs更显得简洁高效，性能方面表现更佳。正如一名资深的开发专家所言，当你所写的代码超过3万行的时候，一个清醒的大脑比什么IDE都强。这时候也许随心所欲比美好的外观更可取，这也是国外很多人士钟情于Emacs的理由。</p>
				<p>下面是对Emacs快捷键的总结，希望能帮助大家更快适应Emacs使用。</p>
				<p>
						<strong>文件操作</strong>
				</p>
				<p>C-x C-f 打开文件,出现提示时输入/username@host:filepath可编辑FTP文件<br />C-x C-v 打开一个文件，取代当前缓冲区<br />C-x C-s 保存文件<br />C-x C-w 存为新文件<br />C-x i 插入文件<br />C-x C-q 切换为只读或者读写模式<br />C-x C-c 退出Emacs</p>
				<p>
						<strong>编辑操作</strong>
				</p>
				<p>C-f 前进一个字符<br />C-b 后退一个字符<br />M-f 前进一个字<br />M-b 后退一个字<br />C-a 移到行首<br />C-e 移到行尾<br />M-a 移到句首<br />M-e 移到句尾<br />C-p 后退一行<br />C-n 前进一行<br />M-x goto-line 跳到指定行<br />C-v 向下翻页<br />M-v 向上翻页<br />M-&lt; 缓冲区头部<br />M-&gt; 缓冲区尾部</p>
				<p>C-M-f 向前匹配括号<br />C-M-b 向后匹配括号</p>
				<p>C-l 当前行居中</p>
				<p>M-n or C-u n 重复操作随后的命令n次<br />C-u 重复操作随后的命令4次<br />C-u C-u 重复操作随后的命令8次<br />C-x ESC ESC 执行历史命令记录，M-p选择上一条命令，M-n选择下一条命令</p>
				<p>C-d 删除一个字符<br />M-d 删除一个字<br />C-k 删除一行<br />M-k 删除一句<br />C-w 删除标记区域</p>
				<p>C-y 粘贴删除的内容</p>
				<p>注意：C-y可以粘贴连续C-k删除的内容；先按C-y，然后按M-y可以选择粘贴被删除的内容</p>
				<p>C-@ 标记开始区域<br />C-x h 标记所有文字<br />C-x C-x 交换光标位置和区域标记区开头<br />M-w 复制标记区域</p>
				<p>C-_ or C-x u 撤消操作</p>
				<p>
						<strong>执行SHELL命令</strong>
				</p>
				<p>M-x shell 打开SHELL<br />M-! 执行SHELL命令 (shell-command)<br />M-1 M-! 执行SHELL命令,命令输出插入光标位置,不打开新输出窗口<br />M-| 针对某一特定区域执行命令(shell-command-on-region), 比如 C-x h M-|uuencode</p>
				<p>
						<strong>窗口操作</strong>
				</p>
				<p>C-x 0 关闭本窗口<br />C-x 1 只留下一个窗口<br />C-x 2 垂直均分窗口<br />C-x 3 水平均分窗口<br />C-x o 切换到别的窗口<br />C-x s 保存所有窗口的缓冲<br />C-x b 选择当前窗口的缓冲区<br />C-x ^ 纵向扩大窗口<br />C-x } 横向扩大窗口</p>
				<p>
						<strong>缓冲区列表操作</strong>
				</p>
				<p>C-x C-b 打开缓冲区列表<br />d or k 标记为删除<br />~ 标记为未修改状态<br />% 标记为只读<br />s 保存缓冲<br />u 取消标记<br />x 执行标记的操作</p>
				<p>f 在当前窗口打开该缓冲区<br />o 在其他窗口打开该缓冲区</p>
				<p>
						<strong>目录操作</strong>
				</p>
				<p>C-x d 打开目录模式<br />s 按日期/文件名排序显示<br />v 阅读光标所在的文件<br />q 退出阅读的文件<br />d 标记为删除<br />x 执行标记<br />D 马上删除当前文件<br />C 拷贝当前文件<br />R 重名名当前文件<br />+ 新建文件夹<br />Z 压缩文件<br />! 对光标所在的文件执行SHELL命令<br />g 刷新显示<br />i 在当前缓冲区的末尾插入子目录的内容</p>
				<p>[n]m 标记光标所在的文件，如果指定n，则从光标所在的文件起后n个文件被标记<br />[n]u 取消当前光标标记的文件，n的含义同上<br />t 反向标记文件<br />%-m 正则标记</p>
				<p>q 退出目录模式</p>
				<p>说明：在目录模式中，如果输入!，在命令行中包含*或者?，有特殊的含义。*匹配当前光标所在的文件和所有标记的文件，?分别在每一个标记的文件上执行该命令。</p>
				<p>
						<strong>程序编译</strong>
				</p>
				<p>M-x compile 执行编译操作<br />M-x gdb GDB排错<br />M-x dbx DBX排错<br />M-x xdb XDB排错<br />M-x sdb SDB排错</p>
				<p>
						<strong>搜索模式</strong>
				</p>
				<p>C-s key 向前搜索<br />C-s 查找下一个<br />ENTER 停止搜索<br />C-r key 反向搜索<br />C-s C-w 以光标所在位置的字为关键字搜索<br />C-s C-s 重复上次搜索<br />C-r C-r 重复上次反向搜索<br />C-s ENTER C-w 进入单词搜索模式<br />C-r ENTER C-w 进入反向单词搜索模式<br />M-x replace-string ENTER search-string ENTER 替换<br />M-% search-string ENTER replace-string ENTER 交互替换<br />C-r 在进入查找/替换模式后，该命令进入迭代编辑模式<br />C-M-x 退出迭代编辑模式，返回到查找/替换模式<br />C-M-s 向前正则搜索<br />C-M-r 向后正则搜索<br />C-M-% 正则交互替换</p>
				<p>
						<strong>SHELL模式</strong>
				</p>
				<p>C-c C-c 相当于Bash下的C-c<br />C-c C-z 相当于Bash下的C-z<br />C-c C-d 相当于Bash下的C-d<br />M-p 执行前一条命令<br />C-n 执行下一条命令<br />C-c C-o 删除最后一条命令产生的输出<br />C-c C-r 屏幕滚动到最后一条命令输出的开头<br />C-c C-e 屏幕滚动到最后一套命令输出的结尾<br />C-c C-p 查看前一条命令的输出<br />C-c C-n 查看后一条命令的输出</p>
				<p>
						<strong>打印资料</strong>
				</p>
				<p>M-x print-buffer 先使用pr,然后使用lpr<br />M-x lpr-buffer 直接使用lpr<br />M-x print-region<br />M-x lpr-region</p>
				<p>
						<strong>收发邮件</strong>
				</p>
				<p>M-x mail 发送邮件, C-c C-s 发送,C-c C-c 发送并退出<br />M-x rmail 接受邮件</p>
				<p>
						<strong>参考资料：</strong>
				</p>
				<p>O'Reilly, Emacs 3rd Edition<br /><br />from: <a href="http://www.devfront.com:8080/?q=node/115">http://www.devfront.com:8080/?q=node/115</a></p>
		</div>
<img src ="http://www.blogjava.net/weidagang2046/aggbug/60865.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/weidagang2046/" target="_blank">weidagang2046</a> 2006-07-30 15:56 <a href="http://www.blogjava.net/weidagang2046/articles/60865.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Using gdb under gnu Emacs</title><link>http://www.blogjava.net/weidagang2046/articles/60685.html</link><dc:creator>weidagang2046</dc:creator><author>weidagang2046</author><pubDate>Sat, 29 Jul 2006 00:51:00 GMT</pubDate><guid>http://www.blogjava.net/weidagang2046/articles/60685.html</guid><wfw:comment>http://www.blogjava.net/weidagang2046/comments/60685.html</wfw:comment><comments>http://www.blogjava.net/weidagang2046/articles/60685.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/weidagang2046/comments/commentRss/60685.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/weidagang2046/services/trackbacks/60685.html</trackback:ping><description><![CDATA[
		<p>
				<font face="Verdana" size="2">A special interface allows you to use gnu Emacs to view (and edit) the source files for the program you are debugging with gdb. </font>
		</p>
		<p>
				<font face="Verdana" size="2">To use this interface, use the command <tt class="USERINPUT"><b>M-x gdb</b></tt> in Emacs. Give the executable file you want to debug as an argument. This command starts gdb as a subprocess of Emacs, with input and output through a newly created Emacs buffer. </font>
		</p>
		<p>
				<font face="Verdana" size="2">Using gdb under Emacs is just like using gdb normally except for two things: </font>
		</p>
		<p>
				<font face="Verdana" size="2">
				</font>
		</p>
		<ul>
				<li style="LIST-STYLE-TYPE: disc">
						<p>
								<font face="Verdana" size="2">All "terminal" input and output goes through the Emacs buffer. </font>
						</p>
				</li>
		</ul>
		<p>
				<font face="Verdana" size="2">This applies both to gdb commands and their output, and to the input and output done by the program you are debugging. </font>
		</p>
		<p>
				<font face="Verdana" size="2">This is useful because it means that you can copy the text of previous commands and input them again; you can even use parts of the output in this way. </font>
		</p>
		<p>
				<font face="Verdana" size="2">All the facilities of Emacs' Shell mode are available for interacting with your program. In particular, you can send signals the usual way--for example, <tt class="USERINPUT"><b>C-c C-c</b></tt> for an interrupt, <tt class="USERINPUT"><b>C-c C-z</b></tt> for a stop. </font>
		</p>
		<p>
				<font face="Verdana" size="2">
				</font>
		</p>
		<ul>
				<li style="LIST-STYLE-TYPE: disc">
						<p>
								<font face="Verdana" size="2">gdb displays source code through Emacs. </font>
						</p>
				</li>
		</ul>
		<p>
				<font face="Verdana" size="2">Each time gdb displays a stack frame, Emacs automatically finds the source file for that frame and puts an arrow (<tt class="COMMAND">=&gt;</tt>) at the left margin of the current line. Emacs uses a separate buffer for source display, and splits the screen to show both your gdb session and the source. </font>
		</p>
		<p>
				<font face="Verdana" size="2">Explicit gdb <tt class="COMMAND">list</tt> or search commands still produce output as usual, but you probably have no reason to use them from Emacs. </font>
		</p>
		<a name="AEN12915">
		</a>
		<blockquote class="BLOCKQUOTE">
				<p>
						<font face="Verdana">
								<font size="2">
										<i class="EMPHASIS">Warning:</i> If the directory where your program resides is not your current directory, it can be easy to confuse Emacs about the location of the source files, in which case the auxiliary display buffer does not appear to show your source. gdb can find programs by searching your environment's <tt class="COMMAND">PATH</tt> variable, so the gdb input and output session proceeds normally; but Emacs does not get enough information back from gdb to locate the source files in this situation. To avoid this problem, either start gdb mode from the directory where your program resides, or specify an absolute file name when prompted for the <tt class="USERINPUT"><b>M-x gdb</b></tt> argument. </font>
						</font>
				</p>
				<p>
						<font face="Verdana" size="2">A similar confusion can result if you use the gdb <tt class="COMMAND">file</tt> command to switch to debugging a program in some other location, from an existing gdb buffer in Emacs. </font>
				</p>
		</blockquote>
		<p>
				<font face="Verdana" size="2">By default, <tt class="USERINPUT"><b>M-x gdb</b></tt> calls the program called <tt class="COMMAND">gdb</tt>. If you need to call gdb by a different name (for example, if you keep several configurations around, with different names) you can set the Emacs variable <tt class="COMMAND">gdb-command-name</tt>; for example, </font>
		</p>
		<p>
		</p>
		<table class="SCREEN" width="100%" bgcolor="#dcdcdc">
				<tbody>
						<tr>
								<td>
										<pre class="SCREEN">
												<font face="Verdana" size="2">(setq gdb-command-name "mygdb")</font>
										</pre>
								</td>
						</tr>
				</tbody>
		</table>
		<p>
				<font face="Verdana" size="2">(preceded by <tt class="USERINPUT"><b>M-:</b></tt> or <tt class="USERINPUT"><b>ESC :</b></tt>, or typed in the <tt class="COMMAND">*scratch*</tt> buffer, or in your <tt class="COMMAND">.emacs</tt> file) makes Emacs call the program named "<tt class="COMMAND">mygdb</tt>" instead. </font>
		</p>
		<p>
				<font face="Verdana" size="2">In the gdb I/O buffer, you can use these special Emacs commands in addition to the standard Shell mode commands: </font>
		</p>
		<p>
				<font face="Verdana" size="2">
				</font>
		</p>
		<div class="VARIABLELIST">
				<dl>
						<dt>
								<font face="Verdana">
										<font size="2">
												<tt class="USERINPUT">
														<b>C-h m</b>
												</tt>
										</font>
								</font>
						</dt>
						<dd>
								<p>
										<font face="Verdana" size="2">Describe the features of Emacs' gdb Mode. </font>
								</p>
						</dd>
						<dt>
								<font face="Verdana">
										<font size="2">
												<tt class="USERINPUT">
														<b>M-s</b>
												</tt>
										</font>
								</font>
						</dt>
						<dd>
								<p>
										<font face="Verdana" size="2">Execute to another source line, like the gdb <tt class="COMMAND">step</tt> command; also update the display window to show the current file and location. </font>
								</p>
						</dd>
						<dt>
								<font face="Verdana">
										<font size="2">
												<tt class="USERINPUT">
														<b>M-n</b>
												</tt>
										</font>
								</font>
						</dt>
						<dd>
								<p>
										<font face="Verdana" size="2">Execute to next source line in this function, skipping all function calls, like the gdb <tt class="COMMAND">next</tt> command. Then update the display window to show the current file and location. </font>
								</p>
						</dd>
						<dt>
								<font face="Verdana">
										<font size="2">
												<tt class="USERINPUT">
														<b>M-i</b>
												</tt>
										</font>
								</font>
						</dt>
						<dd>
								<p>
										<font face="Verdana" size="2">Execute one instruction, like the gdb <tt class="COMMAND">stepi</tt> command; update display window accordingly. </font>
								</p>
						</dd>
						<dt>
								<font face="Verdana">
										<font size="2">
												<tt class="USERINPUT">
														<b>M-x gdb-nexti</b>
												</tt>
										</font>
								</font>
						</dt>
						<dd>
								<p>
										<font face="Verdana" size="2">Execute to next instruction, using the gdb <tt class="COMMAND">nexti</tt> command; update display window accordingly. </font>
								</p>
						</dd>
						<dt>
								<font face="Verdana">
										<font size="2">
												<tt class="USERINPUT">
														<b>C-c C-f</b>
												</tt>
										</font>
								</font>
						</dt>
						<dd>
								<p>
										<font face="Verdana" size="2">Execute until exit from the selected stack frame, like the gdb <tt class="COMMAND">finish</tt> command. </font>
								</p>
						</dd>
						<dt>
								<font face="Verdana">
										<font size="2">
												<tt class="USERINPUT">
														<b>M-c</b>
												</tt>
										</font>
								</font>
						</dt>
						<dd>
								<p>
										<font face="Verdana" size="2">Continue execution of your program, like the gdb <tt class="COMMAND">continue</tt> command. </font>
								</p>
								<p>
										<font face="Verdana">
												<font size="2">
														<i class="EMPHASIS">Warning:</i> In Emacs v19, this command is <tt class="USERINPUT"><b>C-c C-p</b></tt>. </font>
										</font>
								</p>
						</dd>
						<dt>
								<font face="Verdana">
										<font size="2">
												<tt class="USERINPUT">
														<b>M-u</b>
												</tt>
										</font>
								</font>
						</dt>
						<dd>
								<p>
										<font face="Verdana" size="2">Go up the number of frames indicated by the numeric argument (), like the gdb <tt class="COMMAND">up</tt> command. </font>
								</p>
								<p>
										<font face="Verdana">
												<font size="2">
														<i class="EMPHASIS">Warning:</i> In Emacs v19, this command is <tt class="USERINPUT"><b>C-c C-u</b></tt>. </font>
										</font>
								</p>
						</dd>
						<dt>
								<font face="Verdana">
										<font size="2">
												<tt class="USERINPUT">
														<b>M-d</b>
												</tt>
										</font>
								</font>
						</dt>
						<dd>
								<p>
										<font face="Verdana" size="2">Go down the number of frames indicated by the numeric argument, like the gdb <tt class="COMMAND">down</tt> command. </font>
								</p>
								<p>
										<font face="Verdana">
												<font size="2">
														<i class="EMPHASIS">Warning:</i> In Emacs v19, this command is <tt class="USERINPUT"><b>C-c C-d</b></tt>. </font>
										</font>
								</p>
						</dd>
						<dt>
								<font face="Verdana">
										<font size="2">
												<tt class="USERINPUT">
														<b>C-x &amp;</b>
												</tt>
										</font>
								</font>
						</dt>
						<dd>
								<p>
										<font face="Verdana" size="2">Read the number where the cursor is positioned, and insert it at the end of the gdb I/O buffer. For example, if you wish to disassemble code around an address that was displayed earlier, type <tt class="USERINPUT"><b>disassemble</b></tt>; then move the cursor to the address display, and pick up the argument for <tt class="COMMAND">disassemble</tt> by typing <tt class="USERINPUT"><b>C-x &amp;</b></tt>. </font>
								</p>
								<p>
										<font face="Verdana" size="2">You can customize this further by defining elements of the list <tt class="COMMAND">gdb-print-command</tt>; once it is defined, you can format or otherwise process numbers picked up by <tt class="USERINPUT"><b>C-x &amp;</b></tt> before they are inserted. A numeric argument to <tt class="USERINPUT"><b>C-x &amp;</b></tt> indicates that you wish special formatting, and also acts as an index to pick an element of the list. If the list element is a string, the number to be inserted is formatted using the Emacs function <tt class="COMMAND">format</tt>; otherwise the number is passed as an argument to the corresponding list element. </font>
								</p>
						</dd>
				</dl>
		</div>
		<p>
				<font face="Verdana" size="2">In any source file, the Emacs command <tt class="USERINPUT"><b>C-x SPC</b></tt> (<tt class="COMMAND">gdb-break</tt>) tells gdb to set a breakpoint on the source line point is on. </font>
		</p>
		<p>
				<font face="Verdana" size="2">If you accidentally delete the source-display buffer, an easy way to get it back is to type the command <tt class="COMMAND">f</tt> in the gdb buffer, to request a frame display; when you run under Emacs, this recreates the source buffer if necessary to show you the context of the current frame. </font>
		</p>
		<p>
				<font face="Verdana" size="2">The source files displayed in Emacs are in ordinary Emacs buffers which are visiting the source files in the usual way. You can edit the files with these buffers if you wish; but keep in mind that gdb communicates with Emacs in terms of line numbers. If you add or delete lines from the text, the line numbers that gdb knows cease to correspond properly with the code. <br /><br />from: <a href="http://www.redhat.com/docs/manuals/enterprise/RHEL-3-Manual/gdb/emacs.html">http://www.redhat.com/docs/manuals/enterprise/RHEL-3-Manual/gdb/emacs.html</a></font>
		</p>
<img src ="http://www.blogjava.net/weidagang2046/aggbug/60685.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/weidagang2046/" target="_blank">weidagang2046</a> 2006-07-29 08:51 <a href="http://www.blogjava.net/weidagang2046/articles/60685.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>在Emacs下用C/C++编程</title><link>http://www.blogjava.net/weidagang2046/articles/60668.html</link><dc:creator>weidagang2046</dc:creator><author>weidagang2046</author><pubDate>Fri, 28 Jul 2006 15:23:00 GMT</pubDate><guid>http://www.blogjava.net/weidagang2046/articles/60668.html</guid><wfw:comment>http://www.blogjava.net/weidagang2046/comments/60668.html</wfw:comment><comments>http://www.blogjava.net/weidagang2046/articles/60668.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/weidagang2046/comments/commentRss/60668.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/weidagang2046/services/trackbacks/60668.html</trackback:ping><description><![CDATA[
		<h2>
				<font face="Verdana" size="2">版权说明和参考文献</font>
		</h2>
		<p>
				<font face="Verdana" size="2">按照惯例，我写的文章在最开始处放版权说明和参考文献。 </font>
		</p>
		<h3>
				<font face="Verdana" size="2">参考文献：</font>
		</h3>
		<ul>
				<li>
						<font face="Verdana" size="2">hhuu @ newsmth 的《Emacs的日常生活》 </font>
				</li>
				<li>
						<font face="Verdana" size="2">emacs 的文档 </font>
				</li>
				<li>
						<font face="Verdana" size="2">emacs 相关插件的文档 </font>
				</li>
		</ul>
		<h3>
				<font face="Verdana" size="2">版权说明：</font>
		</h3>
		<p>
				<font face="Verdana" size="2">转载请注明转自</font>
				<a href="http://www.caole.net/">
						<font face="Verdana" size="2">曹乐的个人主页</font>
				</a>
				<font face="Verdana" size="2"> www.caole.net，请保证全文转载，尤其不可省略这一部分。 </font>
		</p>
		<h2>
				<font face="Verdana" size="2">序</font>
		</h2>
		<p>
				<font face="Verdana" size="2">用emacs写程序也有5个年头了，深切地体会到Emacs的强大。程序员有三种，一种是用vi的，一种是用emacs的，还有一种是其他。或许有些夸张，但也颇能体现出emacs在程序员中的地位。 </font>
		</p>
		<p>
				<font face="Verdana" size="2">emacs最大的问题在于入门门槛较高。它看起来和多数人想象中的IDE相差甚远，很多人看到emacs的第一眼就觉得它是个记事本（还是个非常难用的记事本），稍微好些的往往觉得emacs也就是个ultraEditor而已，真是暴殄天物了。 </font>
		</p>
		<p>
				<font face="Verdana" size="2">我是个懒人，不喜欢记太多的快捷键，相信很多人和我一样。所以从我后面的叙述可以看出来，除了常用的命令都是快捷键外，其他命令多数都是用M-x执行或者用鼠标点菜单。这仅仅是个人风格问题，先说明一下。 </font>
		</p>
		<p>
				<font face="Verdana" size="2">我的基本编程环境是： </font>
		</p>
		<ul>
				<li>
						<font face="Verdana" size="2">Debian GNU/Linux sid 操作系统 </font>
				</li>
				<li>
						<font face="Verdana" size="2">Gnome 2.10.0 桌面环境 </font>
				</li>
				<li>
						<font face="Verdana" size="2">GUN Emacs 23.0.0.1 for debian </font>
				</li>
				<li>
						<font face="Verdana" size="2">使用 Gnu tool chains(gcc,make,gdb等等) </font>
				</li>
		</ul>
		<p>
				<font face="Verdana" size="2">后面的叙述都基于上述环境。另外，本文主要针对C/C++程序开发，对其他语言有些也适用，从难度上说，本文主要针对入门者。 </font>
		</p>
		<p>
				<font face="Verdana" size="2">本文肯定会有很多错误，</font>
				<a href="mailto:caole82%40gmail.com">
						<font face="Verdana" size="2">请指正</font>
				</a>
				<font face="Verdana" size="2">，谢谢。 </font>
		</p>
		<h2>
				<font face="Verdana" size="2">基本流程</font>
		</h2>
		<p>
				<font face="Verdana" size="2">写C++程序基本上是这么几个步骤： </font>
		</p>
		<ol>
				<li>
						<font face="Verdana" size="2">编辑代码 </font>
				</li>
				<li>
						<font face="Verdana" size="2">编写Makefile </font>
				</li>
				<li>
						<font face="Verdana" size="2">编译代码，修改编译错误 </font>
				</li>
				<li>
						<font face="Verdana" size="2">调试代码，修改逻辑错误 </font>
				</li>
		</ol>
		<p>
				<font face="Verdana" size="2">当然，往往还需要阅读别人的代码。 </font>
		</p>
		<p>
				<font face="Verdana" size="2">根据上述步骤，本文主要针对以下几个方面： </font>
		</p>
		<ul>
				<li>
						<font face="Verdana" size="2">配置Emacs，建立便利的代码编辑环境和Makefile编写环境。 </font>
				</li>
				<li>
						<font face="Verdana" size="2">在Emacs中编译代码，并修改编译错误。 </font>
				</li>
				<li>
						<font face="Verdana" size="2">在Emacs中配合GDB调试程序。 </font>
				</li>
				<li>
						<font face="Verdana" size="2">利用cscope和ecb在emacs中阅读代码。 </font>
				</li>
		</ul>
		<h2>
				<font face="Verdana" size="2">基本环境设置</font>
		</h2>
		<h3>
				<font face="Verdana" size="2">编辑环境配置</font>
		</h3>
		<p>
				<font face="Verdana" size="2">要写C++程序，当然要用到cc-mode插件。CC-Mode原本是支持C语言的，但现在也能支持很多语言，比如C++，Java，Objective-C，CORBA，AWK，Pike等等。CC-Mode是gnu-emacs的标准插件。如果您要求不高，那么默认的配置或许就能满足。CC-Mode的各种行为都可以自由地定制，您可以参考这里的文档：</font>
				<a href="http://cc-mode.sourceforge.net/html-manual/index.html">
						<font face="Verdana" size="2">CC-Mode参考文档</font>
				</a>
		</p>
		<p>
				<font face="Verdana" size="2">这里是我的.emacs文件中关于CC-Mode配置的部分，仅供参考： </font>
		</p>
		<pre class="example">
				<font face="Verdana" size="2">;;;; CC-mode配置  http://cc-mode.sourceforge.net/
(require 'cc-mode)
(c-set-offset 'inline-open 0)
(c-set-offset 'friend '-)
(c-set-offset 'substatement-open 0)
</font>
		</pre>
		<pre class="example">
				<font face="Verdana" size="2">;;;;我的C/C++语言编辑策略

(defun my-c-mode-common-hook()
  (setq tab-width 4 indent-tabs-mode nil)
  ;;; hungry-delete and auto-newline
  (c-toggle-auto-hungry-state 1)
  ;;按键定义
  (define-key c-mode-base-map [(control \`)] 'hs-toggle-hiding)
  (define-key c-mode-base-map [(return)] 'newline-and-indent)
  (define-key c-mode-base-map [(f7)] 'compile)
  (define-key c-mode-base-map [(meta \`)] 'c-indent-command)
;;  (define-key c-mode-base-map [(tab)] 'hippie-expand)
  (define-key c-mode-base-map [(tab)] 'my-indent-or-complete)
  (define-key c-mode-base-map [(meta ?/)] 'semantic-ia-complete-symbol-menu)
</font>
		</pre>
		<p>
				<font face="Verdana" size="2">注意一下，上面最后两行是代码自动补齐的快捷键。后面我会提到代码自动补齐。 </font>
		</p>
		<pre class="example">
				<font face="Verdana" size="2">  ;;预处理设置
  (setq c-macro-shrink-window-flag t)
  (setq c-macro-preprocessor "cpp")
  (setq c-macro-cppflags " ")
  (setq c-macro-prompt-flag t)
  (setq hs-minor-mode t)
  (setq abbrev-mode t)
)
(add-hook 'c-mode-common-hook 'my-c-mode-common-hook)

;;;;我的C++语言编辑策略
(defun my-c++-mode-hook()
  (setq tab-width 4 indent-tabs-mode nil)
  (c-set-style "stroustrup")
;;  (define-key c++-mode-map [f3] 'replace-regexp)
)
</font>
		</pre>
		<h3>
				<font face="Verdana" size="2">自动补齐</font>
		</h3>
		<p>
				<font face="Verdana" size="2">自动补齐通常用的都是hippie-expand，我也用了很长时间。不过有时候会觉得这个自动补齐“傻”了一点，常会补齐出一些毫不相干的东西，因为hippie-expand是根据你敲过的词和kill-ring等进行判断的，并不对程序语法进行分析。 </font>
		</p>
		<p>
				<font face="Verdana" size="2">所以你还需要安装一个代码分析工具，然后把它加进hippie-expand的扩展策略里去。我们可以用semantic。实际上，hippie-expand＋semantic是我所发现的最好的选择了，如果您有更好的，请您也告诉我一声:) </font>
		</p>
		<p>
				<font face="Verdana" size="2">Semantic是</font>
				<a href="http://cedet.sourceforge.net/">
						<font face="Verdana" size="2">CEDET</font>
				</a>
				<font face="Verdana" size="2">中的一个工具，CEDET是Collection of Emacs Development Environment Tools的缩写，它包含了好几个工具，都挺不错的。可惜我只会用其中两个。 </font>
		</p>
		<p>
				<font face="Verdana" size="2">您可以在.emacs中对Semantic进行配置，下面是我的.emacs相关的配置，仅供参考： </font>
		</p>
		<p>
				<font face="Verdana" size="2">导入cedet： </font>
		</p>
		<pre class="example">
				<font face="Verdana" size="2">(load-file "~/lib/emacs-lisp/cedet-1.0pre3/common/cedet.el")
</font>
		</pre>
		<p>
				<font face="Verdana" size="2">配置Semantic的检索范围: </font>
		</p>
		<pre class="example">
				<font face="Verdana" size="2">(setq semanticdb-project-roots 
	  (list
        (expand-file-name "/")))
</font>
		</pre>
		<p>
				<font face="Verdana" size="2">自定义自动补齐命令，这部分是抄hhuu的，如果在单词中间就补齐，否则就是tab。 </font>
		</p>
		<pre class="example">
				<font face="Verdana" size="2">(defun my-indent-or-complete ()
   (interactive)
   (if (looking-at "\\&gt;")
 	  (hippie-expand nil)
 	  (indent-for-tab-command))
 )

(global-set-key [(control tab)] 'my-indent-or-complete)
</font>
		</pre>
		<p>
				<font face="Verdana" size="2">hippie的自动补齐策略，优先调用了senator的分析结果： </font>
		</p>
		<pre class="example">
				<font face="Verdana" size="2">(autoload 'senator-try-expand-semantic "senator")

(setq hippie-expand-try-functions-list
 	  '(
		senator-try-expand-semantic
		try-expand-dabbrev
		try-expand-dabbrev-visible
		try-expand-dabbrev-all-buffers
		try-expand-dabbrev-from-kill
		try-expand-list
		try-expand-list-all-buffers
		try-expand-line
        try-expand-line-all-buffers
        try-complete-file-name-partially
        try-complete-file-name
        try-expand-whole-kill
        )
)
</font>
		</pre>
		<p>
				<font face="Verdana" size="2">注意一下我前面CC-Mode配置中有这么两行： </font>
		</p>
		<pre class="example">
				<font face="Verdana" size="2">  (define-key c-mode-base-map [(tab)] 'my-indent-or-complete)
  (define-key c-mode-base-map [(meta ?/)] 'semantic-ia-complete-symbol-menu)
</font>
		</pre>
		<p>
				<font face="Verdana" size="2">这样，我们在CC-Mode中就可以调用自定义的hippie补全了，快捷键是Tab。 </font>
		</p>
		<p>
				<font face="Verdana" size="2">另外，我还把快捷键“Alt + / ”绑定到了semantic-ia-complete-symbol-menu命令上，这是semantic的命令，它会根据分析结果弹出补齐的菜单，效果如图显示： </font>
		</p>
		<p>
				<a href="http://www.caole.net/diary/pic/semantic-ia.jpg">
						<font face="Verdana" size="2">
								<img src="http://www.caole.net/diary/pic/semantic-ia.jpg" width="400" align="center" />
						</font>
				</a>
		</p>
		<p>
				<font face="Verdana" size="2">CEDET中还有一个不错的工具是speedbar，你可以用它在多个文件中快速切换。在我的.emacs配置文件里，我把speedbar关联到了F5上： </font>
		</p>
		<pre class="example">
				<font face="Verdana" size="2">(global-set-key [(f5)] 'speedbar)
</font>
		</pre>
		<font face="Verdana" size="2">这样用F5就可以调出speedbar，效果如下： </font>
		<p>
		</p>
		<p>
				<a href="http://www.caole.net/diary/pic/speedbar.jpg">
						<font face="Verdana" size="2">
								<img src="http://www.caole.net/diary/pic/speedbar.jpg" width="400" align="center" />
						</font>
				</a>
		</p>
		<p>
				<font face="Verdana" size="2">不过说实话，我自己很少用到speedbar，我通常都是用dired配合bookmark使用:) </font>
		</p>
		<h2>
				<font face="Verdana" size="2">编译和调试程序</font>
		</h2>
		<p>
				<font face="Verdana" size="2">按上面的配置，写完程序和Makefile文件后，在Emacs源代码窗口中按F7就可以进行编译。因为在my-c-mode-common-hook()函数里，有这么一行： </font>
		</p>
		<pre class="example">
				<font face="Verdana" size="2"> (define-key c-mode-base-map [(f7)] 'compile)
</font>
		</pre>
		<p>
				<font face="Verdana" size="2">默认情况下，emacs的compile命令是调用make -k，我把它改成了make。你也可以把它改成其他的，比如gcc之类的。改下面的“make”就行了。 </font>
		</p>
		<pre class="example">
				<font face="Verdana" size="2">'(compile-command "make")
</font>
		</pre>
		<p>
				<font face="Verdana" size="2">Emacs会划分一个窗格显示编译的消息，在编译结束后，emacs会自动将编译器的输出和程序关联起来，告诉你第几行的程序有问题。直接在出错的行号上按Enter，就可以跳转到相应文件的相应行。其实我通常都是用鼠标中键去点出错行号:) </font>
		</p>
		<p>
				<font face="Verdana" size="2">搞定了编译错误后，接着要和逻辑错误斗争了。其实对简单的程序来说，把中间结果打印到终端是最简单好用的调试办法:)不过稍微复杂点的程序就会晕菜了，这时我们就需要拿gdb跟踪程序流程了。 </font>
		</p>
		<p>
				<font face="Verdana" size="2">你用下面的命令就可以启动gdb了。 </font>
		</p>
		<pre class="example">
				<font face="Verdana" size="2">M-x gdb
</font>
		</pre>
		<p>
				<font face="Verdana" size="2">通常我喜欢进入gdb-many-windows模式，这样就会把一个Frame划分为5个窗格，同时显示：gdb命令窗口，当前局部变量，程序文本，调用栈和断点。 </font>
		</p>
		<p>
				<font face="Verdana" size="2">gdb的命令就不在这里说了，它的文档几乎到处都是。emacs把gdb的命令和快捷键做了绑定，对于常用的命令，还是输入快捷键比较方便。比如，C-c C-n是Next line，C-c C-s是step in，其实用的最多的快捷键也就是这两个。 </font>
		</p>
		<p>
				<font face="Verdana" size="2">下面是我的gdb效果图： </font>
		</p>
		<p>
				<a href="http://www.caole.net/diary/pic/gdb.jpg">
						<font face="Verdana" size="2">
								<img src="http://www.caole.net/diary/pic/gdb.jpg" width="400" align="center" />
						</font>
				</a>
		</p>
		<h2>
				<font face="Verdana" size="2">阅读代码</font>
		</h2>
		<p>
				<font face="Verdana" size="2">在emacs下读代码通常有三种工具，最简单的是etags，最复杂的是ecb（emacs code browser），位于中间的是cscope。 </font>
		</p>
		<p>
				<font face="Verdana" size="2">etags和ctags一样，只不过前者是用于emacs的，后者是用于vi的。我个人觉得etags功能稍稍显得不够用一点，当然，也可能是我用的不好:) 欢迎大牛指导。 </font>
		</p>
		<p>
				<font face="Verdana" size="2">使用tags之前要先对源代码分析建立tags文件，在代码所在目录中运行：etags -R 即可。 </font>
		</p>
		<p>
				<font face="Verdana" size="2">我常用的就这几个命令和快捷键： </font>
		</p>
		<pre class="example">
				<font face="Verdana" size="2">M-x visit-tags-table &lt;RET&gt; FILE &lt;RET&gt;   选择tags文件
M-. [TAG] &lt;RET&gt;                         访问标签
M-*                                     返回
C-u M-.                                 寻找标签的下一个定义
</font>
		</pre>
		<p>
				<font face="Verdana" size="2">ecb据说功能强大，但是太复杂了，我懒得折腾它。谁搞定了教教我吧:) 下面是一张ecb的效果图。 </font>
		</p>
		<p>
				<a href="http://www.caole.net/diary/pic/ecb.jpg">
						<font face="Verdana" size="2">
								<img src="http://www.caole.net/diary/pic/ecb.jpg" width="400" align="center" />
						</font>
				</a>
		</p>
		<p>
				<font face="Verdana" size="2">cscope是我感觉比较合适的一个工具。它其实是一个独立的软件，完全可以脱离vi和emacs使用。但是结合emacs的强大功能，cscope就显得更加方便了。GNU Emacs默认自带cscope的支持。在使用之前，cscope也需要对代码进行索引。在emacs中可以这样做： </font>
		</p>
		<pre class="example">
				<font face="Verdana" size="2">C-c s a             设定初始化的目录，一般是你代码的根目录
C-s s I             对目录中的相关文件建立列表并进行索引
</font>
		</pre>
		<p>
				<font face="Verdana" size="2">建完索引之后，你就可以用cscope在代码里游荡了。常用的一些命令如下： </font>
		</p>
		<pre class="example">
				<font face="Verdana" size="2">C-c s s             序找符号
C-c s g             寻找全局的定义
C-c s c             看看指定函数被哪些函数所调用
C-c s C             看看指定函数调用了哪些函数
C-c s e             寻找正则表达式
C-c s f             寻找文件
C-c s i             看看指定的文件被哪些文件include
</font>
		</pre>
		<p>
				<font face="Verdana" size="2">上面这些快捷键其实我自己也常常记不全，没关系，抬头看看上面的菜单栏，有一栏就是Cscope，这些命令里头都有:) </font>
		</p>
		<p>
				<font face="Verdana" size="2">贴一个cscope的效果图吧: </font>
		</p>
		<p>
				<a href="http://www.caole.net/diary/pic/cscope.jpg">
						<font face="Verdana" size="2">
								<img src="http://www.caole.net/diary/pic/cscope.jpg" width="400" align="center" />
						</font>
				</a>
		</p>
		<p>
				<font face="Verdana" size="2">写完了。希望这篇文章对您能有一些用处。有问题或建议可以和</font>
				<a href="mailto:caole82%40gmail.com">
						<font face="Verdana" size="2">我</font>
				</a>
				<font face="Verdana" size="2">联系。 </font>
		</p>
		<!-- Page published by Emacs Wiki ends here -->
<img src ="http://www.blogjava.net/weidagang2046/aggbug/60668.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/weidagang2046/" target="_blank">weidagang2046</a> 2006-07-28 23:23 <a href="http://www.blogjava.net/weidagang2046/articles/60668.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Emacs常用命令速查</title><link>http://www.blogjava.net/weidagang2046/articles/60664.html</link><dc:creator>weidagang2046</dc:creator><author>weidagang2046</author><pubDate>Fri, 28 Jul 2006 14:52:00 GMT</pubDate><guid>http://www.blogjava.net/weidagang2046/articles/60664.html</guid><wfw:comment>http://www.blogjava.net/weidagang2046/comments/60664.html</wfw:comment><comments>http://www.blogjava.net/weidagang2046/articles/60664.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/weidagang2046/comments/commentRss/60664.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/weidagang2046/services/trackbacks/60664.html</trackback:ping><description><![CDATA[
		<font face="Verdana" size="2">Emacs常用命令速查 </font>
		<p>
				<font size="2">
						<font face="Verdana">现在我已经能够熟练使用这些命令了,基本上可以算一个初段的Emacser了,哈哈,总结一下,把这些命令打印出来贴在</font>
						<a class="wordstyle" href="http://www.newasp.cn/" target="_blank">
								<font face="Verdana">电脑</font>
						</a>
						<font face="Verdana">上,不记得了再查查,从今以后尽量做到写代码和文档都用Emacs来完成. <br />1)与文件操作有关的命令 <br />C-x C-f 查找文件并且在新缓冲区中打开 <br />C-x C-v 读入另一个文件替换掉用C-x C-f打开的文件 <br />C-x i 把文件插入到光标的当前位置 <br />C-x C-s 保存文件 <br />C-x C-w 把缓冲区内容写入一个文件 <br />C-x C-c 退出Emacs </font>
				</font>
		</p>
		<p>
				<font face="Verdana" size="2">2)与光标移动操作有关的命令 <br />C-f 光标前移一个字符(右) <br />C-b 光标后移一个字符(左) <br />C-p 光标前移一行(上) <br />C-n 光标后移一行(下) <br />M-f 前移一个单词 <br />M-b 后移一个单词 <br />C-a 移动到行首 <br />C-e 移动到行尾 <br />M-e 前移一个句子 <br />M-a 后移一个句子 <br />M-} 前移一个段落 <br />M-{ 后移一个段落 <br />C-v 屏幕上卷一屏 <br />M-v 屏幕下卷一屏 <br />C-x ] 前移一页 <br />C-x [ 后移一页 <br />M-&lt; 前移到文件头 <br />M-&gt; 后移到文件尾 <br />C-l 重新绘制屏幕，当前行放在画面中心 <br />M-n 或者 C-u n 重复执行n次后续命令 <br />按下M-x后在辅助输入区中输入"goto-line"跳到指定的行，输入"goto-char"跳到指定的字符 </font>
		</p>
		<p>
				<font face="Verdana" size="2">3)与文件删除操作有关的命令 <br />C-d 删除光标位置上的字符 <br />DEL 删除光标前面的字符 <br />M-d 删除光标后面的单词 <br />M-DEL 删除光标前面的单词 <br />C-k 从光标位置删除到行尾 <br />M-k 删除光标后面的句子 <br />C-x DEL 删除光标前面的句子 <br />C-y 恢复被删除的文本或者粘贴最近删除或复制的文本 <br />C-w 删除文件块 <br />按下M-x后在辅助输入区中输入"kill-paragraph"删除光标后面的段落，按下"backward-kill-paragraph"删除光标前面的段落 </font>
		</p>
		<p>
				<font face="Verdana" size="2">4)与文本块操作有关的命令 <br />C-@ 标记文本块的开始(或结束)位置 <br />C-x C-x 互换插入点和文本标记的位置 <br />C-w 或 SHIFT-DEL 删除文本块 <br />M-w 复制文本块 <br />M-h 标记段落 <br />C-x C-p 标记页面 <br />C-x h 标记整个缓冲区 </font>
		</p>
		<p>
				<font face="Verdana" size="2">5)与位置交换操作有关的命令 <br />C-t 交换两个字符的位置 <br />M-t 交换两个单词的位置 <br />C-x C-t 交换两个文本行的位置 <br />按下M-x后在辅助输入区中输入"transpose-sentences"交换两个句子的位置，按下"transpose-paragraph"交换两个段落的位置 </font>
		</p>
		<p>
				<font face="Verdana" size="2">6)与改变字母大小写操作有关的命令 <br />M-c 单词首字母改为大写 <br />M-u 单词的字母全部改为大写 <br />M-l 单词的字母全部改为小写 </font>
		</p>
		<p>
				<font face="Verdana" size="2">7)与查找操作相关的命令 <br />C-s 向前递增查找 <br />C-r 向后递增查找 <br />C-s C-w 开始递增查找，把光标位置的单词做查找字符串 <br />C-s C-y 开始递增查找，把光标位置到行尾之间的文本做查找字符串 <br />C-s return searchstring return 向前开始非递增查找操作 <br />C-r return searchstring return 向后开始非递增查找操作 <br />C-s return C-w 向前开始单词查找(不受换行符、空格、标点符号影响) <br />C-r return C-w 向后开始单词查找(不受换行符、空格、标点符号影响) </font>
		</p>
		<p>
				<font face="Verdana" size="2">8)与使用编辑缓冲区和窗口有关的命令 <br />C-x b 如果输入一个新的文件名则新建一个文件并且编辑,否则打开该文件 <br />C-x s 保存全部缓冲区 <br />C-x b 删除缓冲区 <br />M-x rename-buffer 重命名当前缓冲区 <br />C-x C-q 把当前编辑缓冲区设置为只读属性 <br />C-x 0 删除当前所在的窗口 <br />C-x 1 当前缓冲区满屏显示 <br />C-x 2 创建上下排列的窗口 <br />C-x 3 创建左右排列的窗口 <br />C-x o 在窗口之间移动</font>
		</p>
		<p>
				<font face="Verdana">from: </font>
				<a href="http://www.81819.com/article/131/Linux/2006/2006050114606.html">
						<font face="Verdana">http://www.81819.com/article/131/Linux/2006/2006050114606.html</font>
				</a>
		</p>
<img src ="http://www.blogjava.net/weidagang2046/aggbug/60664.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/weidagang2046/" target="_blank">weidagang2046</a> 2006-07-28 22:52 <a href="http://www.blogjava.net/weidagang2046/articles/60664.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Unix/Linux文件比较命令: comm命令, Diff命令</title><link>http://www.blogjava.net/weidagang2046/articles/33884.html</link><dc:creator>weidagang2046</dc:creator><author>weidagang2046</author><pubDate>Mon, 06 Mar 2006 08:53:00 GMT</pubDate><guid>http://www.blogjava.net/weidagang2046/articles/33884.html</guid><wfw:comment>http://www.blogjava.net/weidagang2046/comments/33884.html</wfw:comment><comments>http://www.blogjava.net/weidagang2046/articles/33884.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/weidagang2046/comments/commentRss/33884.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/weidagang2046/services/trackbacks/33884.html</trackback:ping><description><![CDATA[<H3 class=title>Comm命令 </H3>
<P>如果想对两个有序的文件进行比较，可以使用comm命令。 </P>
<P>语法：comm [- 123 ] file1 file2 </P><A name=more></A>
<P>说明：该命令是对两个已经排好序的文件进行比较。其中file1和file2是已排序的文件。comm读取这两个文件，然后生成三列输出：仅在file1中出现的行；仅在file2中出现的行；在两个文件中都存在的行。如果文件名用“- ”，则表示从标准输入读取。 </P>
<P>选项1、2或3抑制相应的列显示。例如<BR>comm - 12就只显示在两个文件中都存在的行；<BR>comm - 23只显示在第一个文件中出现而未在第二个文件中出现的行；<BR>comm - 123则什么也不显示。 </P>
<P>例如：假设要对文件myfile1和myfile2进行比较 </P>
<P>$ cat myfile1 </P>
<P>main（ ） </P>
<P>{ </P>
<P>float a,b, i, j ,z ; </P>
<P>a=i=10 ; b=j=5 ; </P>
<P>z= i + j ; </P>
<P>printf（“z=%d\\\\n”,z） ; </P>
<P>} </P>
<P>$ cat myfile2 </P>
<P>#include </P>
<P>main（ ） </P>
<P>{ </P>
<P>float i, j ,z ; </P>
<P>i=10 ; j=5 ; </P>
<P>z= i + j ; </P>
<P>printf（“z=%f\\\\n”,z） ; </P>
<P>} </P>
<P>$ comm - 12 myfile1 myfile2 </P>
<P>main（ ） </P>
<P>{ </P>
<P>z= i + j ; </P>
<P>} </P>
<P>就只显示文件myfile1和myfile2中共有的行。 </P>
<P>----------------------------------------------------<BR><STRONG>Diff命令</STRONG> </P>
<P>该命令的功能为逐行比较两个文本文件，列出其不同之处。它比comm命令完成更复杂的检查。它对给出的文件进行系统的检查，并显示出两个文件中所有不同的行，不要求事先对文件进行排序。 </P>
<P>语法：diff [选项] file1 file2 </P>
<P>说明：该命令告诉用户，为了使两个文件file1和file2一致，需要修改它们的哪些行。如果用“- ”表示file1或fiie2，则表示标准输入。如果file1或file2是目录，那么diff将使用该目录中的同名文件进行比较。例如： </P>
<P>diff /usr/xu mine </P>
<P>把目录/usr/xu 中名为mine的文件与当前目录中的mine文件进行比较。 </P>
<P>通常输出由下述形式的行组成： </P>
<P>n1 a n3，n4 </P>
<P>n1，n2 d n3 </P>
<P>n1，n2 c n3，n4 </P>
<P>这些行类似ed命令把filel转换成file2。字母（a、d和c）之前的行号（n1，n2）是针对file1的，其后面的行号（n3，n4）是针对file2的。字母a、d和c分别表示附加、删除和修改操作。 </P>
<P>在上述形式的每一行的后面跟随受到影响的若干行，以“＜”打头的行属于第一个文件，以“＞”打头的行属于第二个文件。 </P>
<P>diff能区别块和字符设备文件以及FIFO（管道文件），不会把它们与普通文件进行比较。 </P>
<P>如果file1和file2都是目录，则diff会产生很多信息。如果一个目录中只有一个文件，则产生一条信息，指出该目录路径名和其中的文件名。 </P>
<P>diff各选项的含义如下： </P>
<P>- b 忽略行尾的空格，而字符串中的一个或多个空格符都视为相等。如How are you与How are you被视为相同的字符串。 </P>
<P>- c 采用上下文输出格式（提供三行上下文）。 </P>
<P>- C n 采用上下文输出格式（提供n行上下文）。 </P>
<P>- e 产生一个合法的ed脚本作为输出。 </P>
<P>- r 当file1和file2是目录时，递归作用到各文件和目录上。 </P>
<P>例如，文件ml.c的内容为（左边行号是有意加上的，以便前后对照）： </P>
<P>1 main（ ） </P>
<P>{ </P>
<P>printf（“Hello！＼n”）； </P>
<P>} </P>
<P>5 </P>
<P>文件m2.c的内容为： </P>
<P>1 main（） </P>
<P>2 { </P>
<P>3 int n , m ; </P>
<P>4 n＝ 10 ; </P>
<P>5 printf （ “ % d \\\\ n ” , m = n * 10）; </P>
<P>6 } </P>
<P>输入命令： </P>
<P>$ diff m1.c m2.c </P>
<P>屏幕上显示： </P>
<P>3，5 c 3，6 </P>
<P>printf（“Hello！＼n”）； </P>
<P>} </P>
<P>＜5 </P>
<P>＞3 int n，m； </P>
<P>＞4 n＝10 ; </P>
<P>＞5 printf （ “ % d \\\\ n ” , m = n * 10）; </P>
<P>＞6 } </P>
<P>　表示把文件m1.c的3至5行改成m2.c的3至6行后，两个文件相同。 </P>
<P>from: <A href="http://www.winterxy.com/blog/000082.html">http://www.winterxy.com/blog/000082.html</A></P><img src ="http://www.blogjava.net/weidagang2046/aggbug/33884.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/weidagang2046/" target="_blank">weidagang2046</a> 2006-03-06 16:53 <a href="http://www.blogjava.net/weidagang2046/articles/33884.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>理解 Xwindow</title><link>http://www.blogjava.net/weidagang2046/articles/31136.html</link><dc:creator>weidagang2046</dc:creator><author>weidagang2046</author><pubDate>Fri, 17 Feb 2006 01:53:00 GMT</pubDate><guid>http://www.blogjava.net/weidagang2046/articles/31136.html</guid><wfw:comment>http://www.blogjava.net/weidagang2046/comments/31136.html</wfw:comment><comments>http://www.blogjava.net/weidagang2046/articles/31136.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/weidagang2046/comments/commentRss/31136.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/weidagang2046/services/trackbacks/31136.html</trackback:ping><description><![CDATA[<P>很多人在用 Xwindow，但是他们是在用一些包装掩盖下的 Xwindow，那些包装有些很不稳定，占用大量资源，以至于有人说 Xwindow 是垃圾。其实 Xwindow 是一个非常出色的图形系统，你应该抱怨的是那些不稳定的包装，而不是 Xwindow 本身。 
<P>Xwindow 是非常巧妙的设计，很多时候它在概念上比其它窗口系统先进，以至于经过很多年它仍然是工作站上的工业标准。许多其它窗口系统的概念都是从 Xwindow 学来的。 
<P>Xwindow 可以说的东西太多了。下面只分辨一些容易混淆的概念，提出一些正确使用它的建议。 
<H2>分辨 X server 和 X client</H2>
<P>这是我被别人问了好多次的问题，我实在不想再对人说一遍了，所以写在这里偷个懒，嘿嘿。 
<P>很多熟悉 Internet 原理的人首次遇到 Xwindow 的这两个概念都会搞错。如果他从一台 Windows 机器上使用 Exceed 通过 XDMCP 登录到一台 Sun 服务器，他就说 Exceed 是客户端(client)，而 Sun 机器是服务器(server)。这就完全搞错了。 
<P>理解了 Xwindow 的工作原理，这个区别就会很明显。X server 不是指你登录的那台机器，而是指一个程序，它负责在某台机器上接受客户的要求，在屏幕上显示客户请求的图形，并且把消息(键盘，鼠标，窗口消息)通知客户程序。 
<P>比如上面例子里的 Exceed 就是一个 X server，它负责控制那台 Windows 机器上的显示(display)，Sun 机器上的程序，xterm, xxgdb, dtwm(CDE的窗口管理器)，……是客户程序。它们通常会使用 TCP 6000 号端口连接 Windows 机器，而Windows机器的 6000 号端口是由 Exceed bind 和 listen 的，怎么样，我们的 Internet 专家，Exceed 看起来是一个 server 吧 :) 
<P>比如，当你通过 telnet 启动 Sun 机器上的 xterm，就会在 Exceed 的屏幕上显示一个窗口。实际发生的事情是： xterm <EM>请求</EM>连接 Windows 机器的 6000 号端口，与Exceed 跟 Exceed 连接，然后xterm<EM>请求</EM>得到资源，然后 xterm <EM>请求</EM>在屏幕上显示一个窗口。 
<P>你在 xterm 的窗口里按下"A"键时，Exceed 会把这个事件<EM>通知</EM> xterm 进程，然后 xterm 会发送数据报，<EM>请求</EM> Exceed, “请在坐标(100,30)处显示一个字母A，然后在后面显示一个矩形作为光标。”，这样你的 xterm 窗口里就会多显示一个字母。 
<P>这下你理解了吗？不？那还是自己多用用，体会体会吧。 
<H2>Xwindow 的网络透明性</H2>
<P>刚才那个 Exceed 用户，他的客户程序不仅可以运行在那台 Sun 机器上，而且可以运行在网络里其它的机器上，或者在本机上。比如他有可能同时通过 telnet 登录到几台 Sun 工作站，几台 Linux PC，他可以在那些机器上都起动 xterm，在这台 Windows 机器上的 Exceed 上显示。如果它安装了 cygwin，他还可以启动本机上的 cygwin里 的 xterm，用同样的方式显示。 
<P>如果他使用 xrdb 在本机的 Exceed 设置了 xterm 的样式，比如背景 midnightblue, 前景 白色，字体 -*-adobe-courier-*，……，那么，Sun, Linux, cygwin 里的 xterm，虽然没有经过配置，但是它们知道：“这个 X server 要求我用这个背景色，这个前景色，这个字体……”，它们会在你的屏幕上显示同样风格的窗口。 
<P>使用鼠标选择一段字符，然后就可以在另外的程序里按鼠标中间，把字符粘贴过去。不论这个程序运行在哪里。 
<P>看看更大的一个图景：你的屏幕上有三台机器上的 xterm, 两台机器上的 gvim，两台机器上的 mozilla 在显示，而它们都受本机的 FVWM 操纵，它们之间可以随意进行拷贝粘贴…… 从这里你可以初步体会到 Xwindow 的网络透明性，它使你方便的操作很多机器。 
<H2>什么是窗口管理器？</H2>
<P>很多人不知道窗口管理器是怎么回事。他们认为 Gnome 和 KDE 是窗口管理器，认为窗口管理器就是能够提供一个工具条，能够配置桌面背景，能够设置很多菜单的东西。而其实，窗口管理器只是 Gnome 和 KDE 的一部分，它的主要功能是你平时根本没有注意，但是却非常重要的操作。窗口管理器的主要功能是：移动窗口，改变窗口大小，图标化（最小化）窗口，改变窗口层叠顺序…… 
<P>通常的X客户程序不需要知道有人想移动它，它只知道乖乖听窗口管理器的话。如果没有窗口管理器运行，你的程序会一个堆一个，你没有办法操纵被盖在下面的程序，你只能使用最上面一个程序，而且你不能移动它，你不能改变它的大小。这样的系统根本不能用！ 
<P>其实你的窗口上的标题，按钮，漂亮的边框，全都是窗口管理器提供的，而不是程序自己的，这样你用窗口管理器就能改变任何窗口的样式了。当你点击关闭窗口的那个按钮，你其实点击的是窗口管理器放在你的程序窗口上面的一个小窗口，发现它受到点击后，窗口管理器就会通知那个程序：“喂！有人想关掉你，你自己准备准备后事，然后退出吧。” 
<P>不同的机器在本机显示的窗口，由窗口管理器统一装饰和指挥。比如，窗口管理器决定： xterm 窗口上面都应该有四个按钮，一个在左边，点击它会显示窗口操作菜单，另外三个在右边，分别是最大化，最小化和关闭。窗口都使用 7pixel 厚的边框，窗口首次出现的时候首先在桌面上找一个空位置，如果找不到，就找一个能够最少的遮盖其它窗口的位置…… 
<P>这些都是窗口管理器的职责。 
<H2>Gnome 和 KDE 是什么？</H2>
<P>有人把 Gnome 和 KDE 叫做窗口管理器，甚至还有人把它们叫做 Xwindow。经常看到有人问：“装哪种 Xwindow 好啊？Gnome 还是 KDE？” 其实你不安装 Gnome 和 KDE 也可以使用 Xwindow. 
<P>Gnome 和 KDE 是“桌面系统”，一种很多程序和函数库的集合。它们的设计目的是提供一致的方便的操作方式来满足普通用户的需要。它们不但包含窗口管理器，还有很多实用程序和应用程序，比如配置程序，工具条，编辑器，绘图工具…… 其实 Gnome 可以和很多窗口管理器合作，在历史上，Gnome 使用过的窗口管理器包括 englightenment, sawmill, sawfish, metacity。KDE 的窗口管理器叫做 kwin。 
<P>你也知道，设计整整一套应用程序：编辑器，绘图程序，浏览器，…… 是非常不容易的。所以它们肯定是不如专用的编辑器，绘图程序，浏览器的。不过要求不太高的用户也可以用它们。 
<H2>用 Xwindow 做一个有趣的试验</H2>
<P>现在我们来做一个试验来引起你对 Xwindow 的兴趣。 
<P>很多人离开了 xdm 就不知道怎样启动 "Xwindow" 了。其实 Xwindow 的启动方式很简单。 
<P>首先，启动你的 X server。在 Linux 下，你可以直接输入 "X&amp;"，让一个 X server 在后台运行。这样，一个占据整个屏幕的布满斜纹的窗口（根窗口）就出现了。如果是 Exceed 或者 X-win32，你需要把屏幕设置为 "single window" 才能看到这个窗口。 
<P>接着，Linux 用户需要用 xauth 给你的 X server 设置一个密码，这样别人就不能非法连接你的 X server。你需要Ctrl-Alt-F1切换到tty1才能输入这个命令。Exceed 和 X-win32 的用户不需要这步。以下的例子只用 Linux 作为实例，其它系统的用户可以依葫芦画瓢。 <PRE>xauth add :0 . `mcookie`
</PRE>
<P>好了，现在你可以试试启动一个 xterm 到这个 X server 上： <PRE>xterm -display :0
</PRE>
<P>按 Alt-F7 切换到 X，你看到了一个不受窗口管理器管理的 xterm。试试移动它呢？再切换到 tty1 启动另一个 xterm，两个 xterm 重合了吗？你怎样在第一个 xterm 里输入呢？这样用起来很痛苦吧？那么你可以在 xterm 里启动一个窗口管理器，比如 twm，直接运行 "twm&amp;" 就行了。 
<P>你发现xterm的窗口都被加上了标题栏，按钮和边框，你现在可以移动它们了。试试把 twm 杀死，看看那些标题栏，按钮，边框是不是都消失了？你知道了窗口管理器的作用了吧。 
<P>现在告诉你怎样不用 XDMCP broadcast，绕过 CDE 的登陆界面，而使用 Sun 机器上的 CDE。其实你只需要把刚才那个例子里的 "twm" 换成 CDE 的窗口管理器 dtwm 就行了，或者启动 dtsession。它们一般在 /usr/dt/bin 下。Sun 还有另外一个窗口管理器叫做 OpenLook, 它在系统里的名字叫做 olwm，你自己找找吧。 
<P>现在如果你自己在 Sun 机器上装一个 FVWM，你知道怎么绕过 CDE 登录而启动 FVWM 了吧？你不需要成为 root 就可以使用你喜欢的FVWM了。 
<H2>.Xdefaults 文件的作用</H2>
<P>弄明白 X 的工作原理后，你就可以使用 .Xdefaults 来配置你的程序了。有人不理解 .Xdefaults 是用来干什么的，喜欢用 shell alias 出一些带有很多参数的命令，或者写一些 shell script，里面只有一行带有很多参数的程序调用，然后他说：“.Xdefaults 没用。” 
<P>其实 .Xdefaults 比起这些办法有很多好处。首先，几乎所有的 X 客户程序都可以从 .Xdefaults 文件得到配置信息，比如前景色，背景色，字体…… 这样你可以在同一个文件里配置所有 X 程序的样式，而不用写那么多 shell script。 
<P>另外，如果你用 xrdb .Xdefaults 把这些配置信息写入到根窗口的数据结构里，不是本地机器上的 X 程序也会遵守同样的样式。比如如果你的 .Xdefaults 里面有这些内容： <PRE>XTerm.background: midnightblue
XTerm.foreground: white
</PRE>
<P>然后你用 xrdb ~/.Xdefaults，那么所有的 xterm 都会使用 midnightblue 作为背景色，使用白色显示字符。这些配置，用X术语叫资源(resource)。 
<P>有时候你会开很多 xterm 窗口在机器上，它们来自不同的远程机器，这时候如果它们都用同样的样色和字体，你就不容易分辨它们了。比如有一天，我在实验室的PC机上打开了很多 xterm，它们来自本机，实验室的 Sun 服务器，我宿舍的机器和数据库实验室一台 HP 服务器。在我走之前，想关闭本地的机器，我输入 “shutdown -h now” 在一个我自认是本地的 xterm 上，结果，等了一会儿，我回头看到机器没关掉，只是那个 xterm 停止了响应。我一拍脑袋：糟了，我把宿舍的机器给关掉了！ 
<P>为了避免这种情况，你可以在不同的机器上编辑不同的 .Xdefaults，而不使用 xrdb 在根窗口导入这些配置。这样不同的机器上的 xterm 使用不同的颜色，你就不容易搞错了。 
<H2>怎样更加深入的了解 Xwindow？</H2>
<P>哎哟！我本来想写很多东西，后来发现要需要写的实在太多了。我没那么多时间，没办法，给参考书目吧，你们自己去看。 
<P>学习使用 Xwindow 不是学习使用 Gnome，KDE，…… 很多书籍教用户怎样使用 Gnome, KDE 的菜单，配置程序…… 结果到了最后用户还是没能知道 Xwindow 是怎么回事。用那些菜单谁不会啊？真是浪费大家时间。 
<P>学习 Xwindow，其实最好的一个办法是看看 Xlib 编程的书籍，你可以在图书馆找到这样的书，我推荐 O'reily 的那本 Xlib 程序设计书（我忘了名字了），虽然它很老，但是那上面讲解的 Xwindow 的工作原理一直都没有变过。 
<P>如果你不会编程序，你可以不看编程的部分而得到很多深入的概念上的认识，比如窗口属性，字体，颜色，…… 这些东西在你使用 Xwindow 时会有很大帮助。如果你真的要编写 Xlib 程序，这本书就过时了一点，你最好到 www.x.org 去免费下载最新的 Xlib 手册来看。 </P>
<P>from: <A href="http://learn.tsinghua.edu.cn:8080/2001315450/x.html">http://learn.tsinghua.edu.cn:8080/2001315450/x.html</A></P><img src ="http://www.blogjava.net/weidagang2046/aggbug/31136.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/weidagang2046/" target="_blank">weidagang2046</a> 2006-02-17 09:53 <a href="http://www.blogjava.net/weidagang2046/articles/31136.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>查看unix版本</title><link>http://www.blogjava.net/weidagang2046/articles/30116.html</link><dc:creator>weidagang2046</dc:creator><author>weidagang2046</author><pubDate>Fri, 10 Feb 2006 04:22:00 GMT</pubDate><guid>http://www.blogjava.net/weidagang2046/articles/30116.html</guid><wfw:comment>http://www.blogjava.net/weidagang2046/comments/30116.html</wfw:comment><comments>http://www.blogjava.net/weidagang2046/articles/30116.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/weidagang2046/comments/commentRss/30116.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/weidagang2046/services/trackbacks/30116.html</trackback:ping><description><![CDATA[uname -a<img src ="http://www.blogjava.net/weidagang2046/aggbug/30116.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/weidagang2046/" target="_blank">weidagang2046</a> 2006-02-10 12:22 <a href="http://www.blogjava.net/weidagang2046/articles/30116.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>去掉文件中的^M字符</title><link>http://www.blogjava.net/weidagang2046/articles/30112.html</link><dc:creator>weidagang2046</dc:creator><author>weidagang2046</author><pubDate>Fri, 10 Feb 2006 03:48:00 GMT</pubDate><guid>http://www.blogjava.net/weidagang2046/articles/30112.html</guid><wfw:comment>http://www.blogjava.net/weidagang2046/comments/30112.html</wfw:comment><comments>http://www.blogjava.net/weidagang2046/articles/30112.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/weidagang2046/comments/commentRss/30112.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/weidagang2046/services/trackbacks/30112.html</trackback:ping><description><![CDATA[当你FTP一些DOS文件到unix下时，你经常会看见每行文件后面有个讨<BR>厌的^M 字符,(把 HTML 文件传输到 UNIX 系统可引起回车符转变成“^M”字符),<BR>有两个简单的方法可以取消它。<BR>用"vi"打开此文件，在Command mode下敲入：<BR>:%s/^V^M//g <BR>或者，在UNIX SHELL下敲入:<BR>sed 's/^V^M//g' foo &gt; foo.new <BR><BR>from: <A href="http://www.chinalinuxpub.com/bbs/archive/index.php/t-16983.html">http://www.chinalinuxpub.com/bbs/archive/index.php/t-16983.html</A><img src ="http://www.blogjava.net/weidagang2046/aggbug/30112.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/weidagang2046/" target="_blank">weidagang2046</a> 2006-02-10 11:48 <a href="http://www.blogjava.net/weidagang2046/articles/30112.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>文件内容统计命令:wc</title><link>http://www.blogjava.net/weidagang2046/articles/28165.html</link><dc:creator>weidagang2046</dc:creator><author>weidagang2046</author><pubDate>Mon, 16 Jan 2006 02:18:00 GMT</pubDate><guid>http://www.blogjava.net/weidagang2046/articles/28165.html</guid><wfw:comment>http://www.blogjava.net/weidagang2046/comments/28165.html</wfw:comment><comments>http://www.blogjava.net/weidagang2046/articles/28165.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/weidagang2046/comments/commentRss/28165.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/weidagang2046/services/trackbacks/28165.html</trackback:ping><description><![CDATA[<FONT color=#000000>wc命令的功能为统计指定文件中的字节数、字数、行数,&nbsp;并将统计结果显示输出。&nbsp; <BR><BR>语法：wc&nbsp;[选项]&nbsp;文件…&nbsp; <BR><BR>说明：该命令统计给定文件中的字节数、字数、行数。如果没有给出文件名，则从标准输入读取。wc同时也给出所有指定文件的总统计数。字是由空格字符区分开的最大字符串。&nbsp; <BR><BR>该命令各选项含义如下：&nbsp; <BR><BR>-&nbsp;c&nbsp;统计字节数。&nbsp; <BR><BR>-&nbsp;l&nbsp;统计行数。&nbsp; <BR><BR>-&nbsp;w&nbsp;统计字数。&nbsp; <BR><BR>这些选项可以组合使用。&nbsp; <BR><BR>输出列的顺序和数目不受选项的顺序和数目的影响。总是按下述顺序显示并且每项最多一列。&nbsp; <BR><BR>行数、字数、字节数、文件名&nbsp; <BR><BR>如果命令行中没有文件名，则输出中不出现文件名。&nbsp; <BR><BR>例如：&nbsp; <BR><BR>$&nbsp;wc&nbsp;-&nbsp;lcw&nbsp;file1&nbsp;file2&nbsp; <BR><BR>4&nbsp;33&nbsp;file1&nbsp; <BR><BR>7&nbsp;52&nbsp;file2&nbsp; <BR><BR>11&nbsp;11&nbsp;85&nbsp;total&nbsp; <BR><BR>省略任选项-lcw，wc命令的执行结果与上面一样。<BR><BR>from: <A href="http://fanqiang.chinaunix.net/a1/b5/20010508/142415.html">http://fanqiang.chinaunix.net/a1/b5/20010508/142415.html</A></FONT><img src ="http://www.blogjava.net/weidagang2046/aggbug/28165.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/weidagang2046/" target="_blank">weidagang2046</a> 2006-01-16 10:18 <a href="http://www.blogjava.net/weidagang2046/articles/28165.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Linux文件查找命令find,xargs详述</title><link>http://www.blogjava.net/weidagang2046/articles/25634.html</link><dc:creator>weidagang2046</dc:creator><author>weidagang2046</author><pubDate>Tue, 27 Dec 2005 14:51:00 GMT</pubDate><guid>http://www.blogjava.net/weidagang2046/articles/25634.html</guid><wfw:comment>http://www.blogjava.net/weidagang2046/comments/25634.html</wfw:comment><comments>http://www.blogjava.net/weidagang2046/articles/25634.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/weidagang2046/comments/commentRss/25634.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/weidagang2046/services/trackbacks/25634.html</trackback:ping><description><![CDATA[<P><FONT id=00 size=4><B>前言：关于find命令</B></FONT></P>
<P>由于find具有强大的功能，所以它的选项也很多，其中大部分选项都值得我们花时间来了解一下。即使系统中含有网络文件系统( NFS)，find命令在该文件系统中同样有效，只你具有相应的权限。</P>
<P>在运行一个非常消耗资源的find命令时，很多人都倾向于把它放在后台执行，因为遍历一个大的文件系统可能会花费很长的时间(这里是指30G字节以上的文件系统)。</P>
<P><FONT id=1 size=4><B><BR>一、find 命令格式<BR></B></FONT></P>
<P><FONT id=1.1 size=3><B><BR>1、find命令的一般形式为；<BR></B></FONT></P>
<P>
<DIV class=codeblock><CODE>find pathname -options [-print -exec -ok ...]</CODE></DIV>
<P></P>
<P><FONT id=1.2 size=3><B><BR>2、find命令的参数；<BR></B></FONT></P>
<P>
<DIV class=codeblock><CODE>pathname: find命令所查找的目录路径。例如用.来表示当前目录，用/来表示系统根目录。<BR>-print： find命令将匹配的文件输出到标准输出。<BR>-exec： find命令对匹配的文件执行该参数所给出的shell命令。相应命令的形式为'command' { } \;，注意{ }和\；之间的空格。<BR>-ok： 和-exec的作用相同，只不过以一种更为安全的模式来执行该参数所给出的shell命令，在执行每一个命令之前，都会给出提示，让用户来确定是否执行。</CODE></DIV>
<P></P>
<P><FONT id=1.3 size=3><B><BR>3、find命令选项<BR></B></FONT><BR>
<DIV class=codeblock><CODE>-name <BR>按照文件名查找文件。<BR>-perm<BR>按照文件权限来查找文件。<BR>-prune<BR>使用这一选项可以使find命令不在当前指定的目录中查找，如果同时使用-depth选项，那么-prune将被find命令忽略。<BR>-user<BR>按照文件属主来查找文件。<BR>-group<BR>按照文件所属的组来查找文件。<BR>-mtime -n +n<BR>按照文件的更改时间来查找文件， - n表示文件更改时间距现在n天以内，+ n表示文件更改时间距现在n天以前。find命令还有-atime和-ctime 选项，但它们都和-m time选项。<BR>-nogroup<BR>查找无有效所属组的文件，即该文件所属的组在/etc/groups中不存在。<BR>-nouser<BR>查找无有效属主的文件，即该文件的属主在/etc/passwd中不存在。<BR>-newer file1 ! file2 <BR>查找更改时间比文件file1新但比文件file2旧的文件。<BR>-type <BR>查找某一类型的文件，诸如：<BR>b - 块设备文件。<BR>d - 目录。<BR>c - 字符设备文件。<BR>p - 管道文件。<BR>l - 符号链接文件。<BR>f - 普通文件。<BR>-size n：[c] 查找文件长度为n块的文件，带有c时表示文件长度以字节计。<BR>-depth：在查找文件时，首先查找当前目录中的文件，然后再在其子目录中查找。<BR>-fstype：查找位于某一类型文件系统中的文件，这些文件系统类型通常可以在配置文件/etc/fstab中找到，该配置文件中包含了本系统中有关文件系统的信息。<BR>-mount：在查找文件时不跨越文件系统mount点。<BR>-follow：如果find命令遇到符号链接文件，就跟踪至链接所指向的文件。<BR>-cpio：对匹配的文件使用cpio命令，将这些文件备份到磁带设备中。</CODE></DIV>
<P></P>
<P>另外,下面三个的区别:<BR>
<DIV class=codeblock><CODE>&nbsp;&nbsp;&nbsp;-amin n<BR>　　查找系统中最后N分钟访问的文件<BR>　　-atime n<BR>　　查找系统中最后n*24小时访问的文件<BR>　　-cmin n<BR>　　查找系统中最后N分钟被改变文件状态的文件<BR>　　-ctime n<BR>　　查找系统中最后n*24小时被改变文件状态的文件<BR>&nbsp;&nbsp;&nbsp;　-mmin n<BR>　　查找系统中最后N分钟被改变文件数据的文件<BR>　　-mtime n<BR>　　查找系统中最后n*24小时被改变文件数据的文件</CODE></DIV>
<P></P>
<P><FONT id=1.4 size=3><B><BR>4、使用exec或ok来执行shell命令<BR></B></FONT></P>
<P>使用find时，只要把想要的操作写在一个文件里，就可以用exec来配合find查找，很方便的</P>
<P>在有些操作系统中只允许-exec选项执行诸如l s或ls -l这样的命令。大多数用户使用这一选项是为了查找旧文件并删除它们。建议在真正执行rm命令删除文件之前，最好先用ls命令看一下，确认它们是所要删除的文件。</P>
<P>exec选项后面跟随着所要执行的命令或脚本，然后是一对儿{ }，一个空格和一个\，最后是一个分号。为了使用exec选项，必须要同时使用print选项。如果验证一下find命令，会发现该命令只输出从当前路径起的相对路径及文件名。</P>
<P>例如：为了用ls -l命令列出所匹配到的文件，可以把ls -l命令放在find命令的-exec选项中</P>
<P>
<DIV class=codeblock><CODE># find . -type f -exec ls -l { } \;<BR>-rw-r--r-- 1 root root 34928 2003-02-25 ./conf/httpd.conf<BR>-rw-r--r-- 1 root root 12959 2003-02-25 ./conf/magic<BR>-rw-r--r-- 1 root root 180 2003-02-25 ./conf.d/README</CODE></DIV>
<P></P>
<P>上面的例子中，find命令匹配到了当前目录下的所有普通文件，并在-exec选项中使用ls -l命令将它们列出。<BR>在/logs目录中查找更改时间在5日以前的文件并删除它们：</P>
<P>
<DIV class=codeblock><CODE>$ find logs -type f -mtime +5 -exec rm { } \;</CODE></DIV>
<P></P>
<P><B>记住：</B>在shell中用任何方式删除文件之前，应当先查看相应的文件，一定要小心！当使用诸如mv或rm命令时，可以使用-exec选项的安全模式。它将在对每个匹配到的文件进行操作之前提示你。</P>
<P>在下面的例子中， find命令在当前目录中查找所有文件名以.LOG结尾、更改时间在5日以上的文件，并删除它们，只不过在删除之前先给出提示。</P>
<P>
<DIV class=codeblock><CODE>$ find . -name "*.conf" -mtime +5 -ok rm { } \;<BR>&lt; rm ... ./conf/httpd.conf &gt; ? n</CODE></DIV>
<P></P>
<P>按y键删除文件，按n键不删除。</P>
<P>任何形式的命令都可以在-exec选项中使用。</P>
<P>在下面的例子中我们使用grep命令。find命令首先匹配所有文件名为“ passwd*”的文件，例如passwd、passwd.old、passwd.bak，然后执行grep命令看看在这些文件中是否存在一个sam用户。</P>
<P>
<DIV class=codeblock><CODE># find /etc -name "passwd*" -exec grep "sam" { } \;<BR>sam:x:501:501::/usr/sam:/bin/bash</CODE></DIV>
<P></P>
<P><FONT id=2 size=4><B><BR>二、find命令的例子；<BR></B></FONT></P>
<P><FONT id=2.1 size=3><B><BR>1、查找当前用户主目录下的所有文件：<BR></B></FONT></P>
<P>下面两种方法都可以使用</P>
<P>
<DIV class=codeblock><CODE>$ find $HOME -print<BR>$ find ~ -print</CODE></DIV><BR><FONT id=2.2 size=3><B><BR>2、让当前目录中文件属主具有读、写权限，并且文件所属组的用户和其他用户具有读权限的文件；<BR></B></FONT>
<P></P>
<P>
<DIV class=codeblock><CODE>$ find . -type f -perm 644 -exec ls -l { } \;</CODE></DIV>
<P></P>
<P><FONT id=2.3 size=3><B><BR>3、为了查找系统中所有文件长度为0的普通文件，并列出它们的完整路径；<BR></B></FONT></P>
<P>
<DIV class=codeblock><CODE>$ find / -type f -size 0 -exec ls -l { } \;</CODE></DIV>
<P></P>
<P><FONT id=2.4 size=3><B><BR>4、查找/var/logs目录中更改时间在7日以前的普通文件，并在删除之前询问它们；<BR></B></FONT></P>
<P>
<DIV class=codeblock><CODE>$ find /var/logs -type f -mtime +7 -ok rm { } \;</CODE></DIV>
<P></P>
<P><FONT id=2.5 size=3><B><BR>5、为了查找系统中所有属于root组的文件；<BR></B></FONT></P>
<P>
<DIV class=codeblock><CODE>$find . -group root -exec ls -l { } \;<BR>-rw-r--r-- 1 root root 595 10月 31 01:09 ./fie1</CODE></DIV>
<P></P>
<P><FONT id=2.6 size=3><B><BR>6、find命令将删除当目录中访问时间在7日以来、含有数字后缀的admin.log文件。<BR></B></FONT></P>
<P>该命令只检查三位数字，所以相应文件的后缀不要超过999。先建几个admin.log*的文件 ，才能使用下面这个命令</P>
<P>
<DIV class=codeblock><CODE>$ find . -name "admin.log[0-9][0-9][0-9]" -atime -7 -ok<BR>rm { } \;<BR>&lt; rm ... ./admin.log001 &gt; ? n<BR>&lt; rm ... ./admin.log002 &gt; ? n<BR>&lt; rm ... ./admin.log042 &gt; ? n<BR>&lt; rm ... ./admin.log942 &gt; ? n</CODE></DIV>
<P></P>
<P><FONT id=2.7 size=3><B><BR>7、为了查找当前文件系统中的所有目录并排序；<BR></B></FONT></P>
<P>
<DIV class=codeblock><CODE>$ find . -type d | sort</CODE></DIV>
<P></P>
<P><FONT id=2.8 size=3><B><BR>8、为了查找系统中所有的rmt磁带设备；<BR></B></FONT></P>
<P>
<DIV class=codeblock><CODE>$ find /dev/rmt -print</CODE></DIV>
<P></P>
<P><FONT id=3 size=4><B><BR>三、xargs<BR></B></FONT></P>
<P>xargs - build and execute command lines from standard input</P>
<P>在使用find命令的-exec选项处理匹配到的文件时， find命令将所有匹配到的文件一起传递给exec执行。但有些系统对能够传递给exec的命令长度有限制，这样在find命令运行几分钟之后，就会出现溢出错误。错误信息通常是“参数列太长”或“参数列溢出”。这就是xargs命令的用处所在，特别是与find命令一起使用。</P>
<P>find命令把匹配到的文件传递给xargs命令，而xargs命令每次只获取一部分文件而不是全部，不像-exec选项那样。这样它可以先处理最先获取的一部分文件，然后是下一批，并如此继续下去。</P>
<P>在有些系统中，使用-exec选项会为处理每一个匹配到的文件而发起一个相应的进程，并非将匹配到的文件全部作为参数一次执行；这样在有些情况下就会出现进程过多，系统性能下降的问题，因而效率不高；</P>
<P>而使用xargs命令则只有一个进程。另外，在使用xargs命令时，究竟是一次获取所有的参数，还是分批取得参数，以及每一次获取参数的数目都会根据该命令的选项及系统内核中相应的可调参数来确定。</P>
<P>来看看xargs命令是如何同find命令一起使用的，并给出一些例子。</P>
<P>下面的例子查找系统中的每一个普通文件，然后使用xargs命令来测试它们分别属于哪类文件</P>
<P>
<DIV class=codeblock><CODE>#find . -type f -print | xargs file<BR>./.kde/Autostart/Autorun.desktop: UTF-8 Unicode English text<BR>./.kde/Autostart/.directory: ISO-8859 text\<BR>......</CODE></DIV>
<P></P>
<P>在整个系统中查找内存信息转储文件(core dump) ，然后把结果保存到/tmp/core.log 文件中：</P>
<P>
<DIV class=codeblock><CODE>$ find / -name "core" -print | xargs echo "" &gt;/tmp/core.log</CODE></DIV>
<P></P>
<P>上面这个执行太慢，我改成在当前目录下查找</P>
<P>
<DIV class=codeblock><CODE>#find . -name "file*" -print | xargs echo "" &gt; /temp/core.log<BR># cat /temp/core.log<BR>./file6</CODE></DIV>
<P></P>
<P>在当前目录下查找所有用户具有读、写和执行权限的文件，并收回相应的写权限：</P>
<P>
<DIV class=codeblock><CODE># ls -l<BR>drwxrwxrwx 2 sam adm 4096 10月 30 20:14 file6<BR>-rwxrwxrwx 2 sam adm 0 10月 31 01:01 http3.conf<BR>-rwxrwxrwx 2 sam adm 0 10月 31 01:01 httpd.conf<BR># find . -perm -7 -print | xargs chmod o-w<BR># ls -l<BR>drwxrwxr-x 2 sam adm 4096 10月 30 20:14 file6<BR>-rwxrwxr-x 2 sam adm 0 10月 31 01:01 http3.conf<BR>-rwxrwxr-x 2 sam adm 0 10月 31 01:01 httpd.conf</CODE></DIV>
<P></P>
<P>用grep命令在所有的普通文件中搜索hostname这个词：</P>
<P>
<DIV class=codeblock><CODE># find . -type f -print | xargs grep "hostname"<BR>./httpd1.conf:# different IP addresses or hostnames and have them handled by the<BR>./httpd1.conf:# VirtualHost: If you want to maintain multiple domains/hostnames<BR>on your</CODE></DIV>
<P></P>
<P>用grep命令在当前目录下的所有普通文件中搜索hostnames这个词：</P>
<P>
<DIV class=codeblock><CODE># find . -name \* -type f -print | xargs grep "hostnames"<BR>./httpd1.conf:# different IP addresses or hostnames and have them handled by the<BR>./httpd1.conf:# VirtualHost: If you want to maintain multiple domains/hostnames<BR>on your</CODE></DIV>
<P></P>
<P>注意，在上面的例子中， \用来取消find命令中的*在shell中的特殊含义。</P>
<P>find命令配合使用exec和xargs可以使用户对所匹配到的文件执行几乎所有的命令。</P>
<P><FONT id=4 size=4><B><BR>四、find 命令的参数<BR></B></FONT></P>
<P>下面是find一些常用参数的例子，有用到的时候查查就行了，像上面前几个贴子，都用到了其中的的一些参数，也可以用man或查看论坛里其它贴子有find的命令手册</P>
<P><FONT id=4.1 size=3><B><BR>1、使用name选项<BR></B></FONT></P>
<P>文件名选项是find命令最常用的选项，要么单独使用该选项，要么和其他选项一起使用。</P>
<P>可以使用某种文件名模式来匹配文件，记住要用引号将文件名模式引起来。</P>
<P>不管当前路径是什么，如果想要在自己的根目录$HOME中查找文件名符合*.txt的文件，使用~作为 'pathname'参数，波浪号~代表了你的$HOME目录。</P>
<P>
<DIV class=codeblock><CODE>$ find ~ -name "*.txt" -print</CODE></DIV>
<P></P>
<P>想要在当前目录及子目录中查找所有的‘ *.txt’文件，可以用：</P>
<P>
<DIV class=codeblock><CODE>$ find . -name "*.txt" -print</CODE></DIV>
<P></P>
<P>想要的当前目录及子目录中查找文件名以一个大写字母开头的文件，可以用：</P>
<P>
<DIV class=codeblock><CODE>$ find . -name "[A-Z]*" -print</CODE></DIV>
<P></P>
<P>想要在/etc目录中查找文件名以host开头的文件，可以用：</P>
<P>
<DIV class=codeblock><CODE>$ find /etc -name "host*" -print</CODE></DIV>
<P></P>
<P>想要查找$HOME目录中的文件，可以用：</P>
<P>
<DIV class=codeblock><CODE>$ find ~ -name "*" -print 或find . -print</CODE></DIV>
<P></P>
<P>要想让系统高负荷运行，就从根目录开始查找所有的文件。</P>
<P>
<DIV class=codeblock><CODE>$ find / -name "*" -print</CODE></DIV>
<P></P>
<P>如果想在当前目录查找文件名以两个小写字母开头，跟着是两个数字，最后是.txt的文件，下面的命令就能够返回名为ax37.txt的文件：</P>
<P>
<DIV class=codeblock><CODE>$find . -name "[a-z][a-z][0--9][0--9].txt" -print</CODE></DIV>
<P></P>
<P><FONT id=4.2 size=3><B><BR>2、用perm选项<BR></B></FONT></P>
<P>按照文件权限模式用-perm选项,按文件权限模式来查找文件的话。最好使用八进制的权限表示法。</P>
<P>如在当前目录下查找文件权限位为755的文件，即文件属主可以读、写、执行，其他用户可以读、执行的文件，可以用：</P>
<P>
<DIV class=codeblock><CODE>$ find . -perm 755 -print</CODE></DIV>
<P></P>
<P>还有一种表达方法：在八进制数字前面要加一个横杠-，表示都匹配，如-007就相当于777，-006相当于666</P>
<P>
<DIV class=codeblock><CODE># ls -l<BR>-rwxrwxr-x 2 sam adm 0 10月 31 01:01 http3.conf<BR>-rw-rw-rw- 1 sam adm 34890 10月 31 00:57 httpd1.conf<BR>-rwxrwxr-x 2 sam adm 0 10月 31 01:01 httpd.conf<BR>drw-rw-rw- 2 gem group 4096 10月 26 19:48 sam<BR>-rw-rw-rw- 1 root root 2792 10月 31 20:19 temp<BR># find . -perm 006<BR># find . -perm -006<BR>./sam<BR>./httpd1.conf<BR>./temp</CODE></DIV>
<P></P>
<P>-perm mode:文件许可正好符合mode</P>
<P>-perm +mode:文件许可部分符合mode</P>
<P>-perm -mode: 文件许可完全符合mode</P>
<P><FONT id=4.3 size=3><B><BR>3、忽略某个目录<BR></B></FONT></P>
<P>如果在查找文件时希望忽略某个目录，因为你知道那个目录中没有你所要查找的文件，那么可以使用-prune选项来指出需要忽略的目录。在使用-prune选项时要当心，因为如果你同时使用了-depth选项，那么-prune选项就会被find命令忽略。</P>
<P>如果希望在/apps目录下查找文件，但不希望在/apps/bin目录下查找，可以用：</P>
<P>
<DIV class=codeblock><CODE>$ find /apps -path "/apps/bin" -prune -o -print</CODE></DIV>
<P></P>
<P><FONT id=4.4 size=3><B><BR>4、使用find查找文件的时候怎么避开某个文件目录<BR></B></FONT></P>
<P>比如要在/usr/sam目录下查找不在dir1子目录之内的所有文件</P>
<P>
<DIV class=codeblock><CODE>find /usr/sam -path "/usr/sam/dir1" -prune -o -print</CODE></DIV>
<P></P>
<P>
<DIV class=codeblock><CODE>find [-path ..] [expression] 在路径列表的后面的是表达式</CODE></DIV>
<P></P>
<P>-path "/usr/sam" -prune -o -print 是 -path "/usr/sam" -a -prune -o<BR>-print 的简写表达式按顺序求值, -a 和 -o 都是短路求值，与 shell 的 &amp;&amp; 和 || 类似如果 -path "/usr/sam" 为真，则求值 -prune , -prune 返回真，与逻辑表达式为真；否则不求值 -prune，与逻辑表达式为假。如果 -path "/usr/sam" -a -prune 为假，则求值 -print ，-print返回真，或逻辑表达式为真；否则不求值 -print，或逻辑表达式为真。</P>
<P>这个表达式组合特例可以用伪码写为</P>
<P>
<DIV class=codeblock><CODE>if -path "/usr/sam" then<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;-prune<BR>else<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;-print</CODE></DIV>
<P></P>
<P>避开多个文件夹</P>
<P>
<DIV class=codeblock><CODE>find /usr/sam \( -path /usr/sam/dir1 -o -path /usr/sam/file1 \) -prune -o -print</CODE></DIV>
<P></P>
<P>圆括号表示表达式的结合。<BR>
<DIV class=codeblock><CODE>\ 表示引用，即指示 shell 不对后面的字符作特殊解释，而留给 find 命令去解释其意义。</CODE></DIV>
<P></P>
<P>查找某一确定文件，-name等选项加在-o 之后</P>
<P>
<DIV class=codeblock><CODE>#find /usr/sam \(-path /usr/sam/dir1 -o -path /usr/sam/file1 \) -prune -o -name "temp" -print</CODE></DIV>
<P></P>
<P><FONT id=4.5 size=3><B><BR>5、使用user和nouser选项<BR></B></FONT></P>
<P>按文件属主查找文件，如在$HOME目录中查找文件属主为sam的文件，可以用：</P>
<P>
<DIV class=codeblock><CODE>$ find ~ -user sam -print</CODE></DIV>
<P></P>
<P>在/etc目录下查找文件属主为uucp的文件：</P>
<P>
<DIV class=codeblock><CODE>$ find /etc -user uucp -print</CODE></DIV>
<P></P>
<P>为了查找属主帐户已经被删除的文件，可以使用-nouser选项。这样就能够找到那些属主在/etc/passwd文件中没有有效帐户的文件。在使用-nouser选项时，不必给出用户名； find命令能够为你完成相应的工作。</P>
<P>例如，希望在/home目录下查找所有的这类文件，可以用：<BR>
<DIV class=codeblock><CODE>$ find /home -nouser -print</CODE></DIV>
<P></P>
<P><FONT id=4.6 size=3><B><BR>6、使用group和nogroup选项<BR></B></FONT></P>
<P>就像user和nouser选项一样，针对文件所属于的用户组， find命令也具有同样的选项，为了在/apps目录下查找属于gem用户组的文件，可以用：</P>
<P>
<DIV class=codeblock><CODE>$ find /apps -group gem -print</CODE></DIV>
<P></P>
<P>要查找没有有效所属用户组的所有文件，可以使用nogroup选项。下面的find命令从文件系统的根目录处查找这样的文件</P>
<P>
<DIV class=codeblock><CODE>$ find / -nogroup-print</CODE></DIV>
<P></P>
<P><FONT id=4.7 size=3><B><BR>7、按照更改时间或访问时间等查找文件<BR></B></FONT></P>
<P>如果希望按照更改时间来查找文件，可以使用mtime,atime或ctime选项。如果系统突然没有可用空间了，很有可能某一个文件的长度在此期间增长迅速，这时就可以用mtime选项来查找这样的文件。</P>
<P>用减号-来限定更改时间在距今n日以内的文件，而用加号+来限定更改时间在距今n日以前的文件。</P>
<P>希望在系统根目录下查找更改时间在5日以内的文件，可以用：</P>
<P>
<DIV class=codeblock><CODE>$ find / -mtime -5 -print</CODE></DIV>
<P></P>
<P>为了在/var/adm目录下查找更改时间在3日以前的文件，可以用：</P>
<P>
<DIV class=codeblock><CODE>$ find /var/adm -mtime +3 -print</CODE></DIV>
<P></P>
<P><FONT id=4.8 size=3><B><BR>8、查找比某个文件新或旧的文件<BR></B></FONT></P>
<P>如果希望查找更改时间比某个文件新但比另一个文件旧的所有文件，可以使用-newer选项。它的一般形式为：</P>
<P>
<DIV class=codeblock><CODE>newest_file_name ! oldest_file_name</CODE></DIV>
<P></P>
<P>其中，！是逻辑非符号。</P>
<P>查找更改时间比文件sam新但比文件temp旧的文件：</P>
<P>例：有两个文件</P>
<P>
<DIV class=codeblock><CODE>-rw-r--r-- 1 sam adm 0 10月 31 01:07 fiel<BR>-rw-rw-rw- 1 sam adm 34890 10月 31 00:57 httpd1.conf<BR>-rwxrwxr-x 2 sam adm 0 10月 31 01:01 httpd.conf<BR>drw-rw-rw- 2 gem group 4096 10月 26 19:48 sam<BR>-rw-rw-rw- 1 root root 2792 10月 31 20:19 temp<BR># find -newer httpd1.conf ! -newer temp -ls<BR>1077669 0 -rwxrwxr-x 2 sam adm 0 10月 31 01:01 ./httpd.conf<BR>1077671 4 -rw-rw-rw- 1 root root 2792 10月 31 20:19 ./temp<BR>1077673 0 -rw-r--r-- 1 sam adm 0 10月 31 01:07 ./fiel</CODE></DIV>
<P></P>
<P>查找更改时间在比temp文件新的文件：</P>
<P>
<DIV class=codeblock><CODE>$ find . -newer temp -print</CODE></DIV><BR><FONT id=4.9 size=3><B><BR>9、使用type选项<BR></B></FONT>
<P></P>
<P>在/etc目录下查找所有的目录，可以用：</P>
<P>
<DIV class=codeblock><CODE>$ find /etc -type d -print</CODE></DIV>
<P></P>
<P>在当前目录下查找除目录以外的所有类型的文件，可以用：<BR>
<DIV class=codeblock><CODE>$ find . ! -type d -print</CODE></DIV>
<P></P>
<P>在/etc目录下查找所有的符号链接文件，可以用<BR>
<DIV class=codeblock><CODE>$ find /etc -type l -print</CODE></DIV>
<P></P>
<P><FONT id=4.10 size=3><B><BR>10、使用size选项<BR></B></FONT></P>
<P>可以按照文件长度来查找文件，这里所指的文件长度既可以用块（block）来计量，也可以用字节来计量。以字节计量文件长度的表达形式为N c；以块计量文件长度只用数字表示即可。</P>
<P>在按照文件长度查找文件时，一般使用这种以字节表示的文件长度，在查看文件系统的大小，因为这时使用块来计量更容易转换。<BR>在当前目录下查找文件长度大于1 M字节的文件：<BR>
<DIV class=codeblock><CODE>$ find . -size +1000000c -print</CODE></DIV>
<P></P>
<P>在/home/apache目录下查找文件长度恰好为100字节的文件：</P>
<P>
<DIV class=codeblock><CODE>$ find /home/apache -size 100c -print</CODE></DIV>
<P></P>
<P>在当前目录下查找长度超过10块的文件（一块等于512字节）： </P>
<P>
<DIV class=codeblock><CODE>$ find . -size +10 -print</CODE></DIV>
<P></P>
<P><FONT id=4.11 size=3><B><BR>11、使用depth选项<BR></B></FONT></P>
<P>在使用find命令时，可能希望先匹配所有的文件，再在子目录中查找。使用depth选项就可以使find命令这样做。这样做的一个原因就是，当在使用find命令向磁带上备份文件系统时，希望首先备份所有的文件，其次再备份子目录中的文件。</P>
<P>在下面的例子中， find命令从文件系统的根目录开始，查找一个名为CON.FILE的文件。</P>
<P>它将首先匹配所有的文件然后再进入子目录中查找。</P>
<P>
<DIV class=codeblock><CODE>$ find / -name "CON.FILE" -depth -print</CODE></DIV>
<P></P>
<P><FONT id=4.12 size=3><B><BR>12、使用mount选项<BR></B></FONT></P>
<P>在当前的文件系统中查找文件（不进入其他文件系统），可以使用find命令的mount选项。</P>
<P>从当前目录开始查找位于本文件系统中文件名以XC结尾的文件：</P>
<P>
<DIV class=codeblock><CODE>$ find . -name "*.XC" -mount -print</CODE></DIV>
<P></P>
<P><BR><BR><FONT id=5 size=4><B>五、关于本文</B></FONT></P>
<P>本文是find 命令的详细说明，可贵的是针对参数举了很多的实例，大量的例证，让初学者更为容易理解；本文是<A href="http://www.linuxsir.org/bbs/member.php?u=57037" target=_blank>zhy2111314</A>兄贴在论坛中；我对本文进行了再次整理，为方便大家阅读； ── 北南南北</P>
<P><FONT id=6 size=4><B>六、相关文档</B></FONT></P>
<P><STRONG><FONT size=4>from: <A href="http://www.linuxsir.org/main/?q=node/137">http://www.linuxsir.org/main/?q=node/137</A></FONT></STRONG></P><img src ="http://www.blogjava.net/weidagang2046/aggbug/25634.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/weidagang2046/" target="_blank">weidagang2046</a> 2005-12-27 22:51 <a href="http://www.blogjava.net/weidagang2046/articles/25634.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>awk详解</title><link>http://www.blogjava.net/weidagang2046/articles/25374.html</link><dc:creator>weidagang2046</dc:creator><author>weidagang2046</author><pubDate>Sun, 25 Dec 2005 07:57:00 GMT</pubDate><guid>http://www.blogjava.net/weidagang2046/articles/25374.html</guid><wfw:comment>http://www.blogjava.net/weidagang2046/comments/25374.html</wfw:comment><comments>http://www.blogjava.net/weidagang2046/articles/25374.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/weidagang2046/comments/commentRss/25374.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/weidagang2046/services/trackbacks/25374.html</trackback:ping><description><![CDATA[a w k是一种程序语言，对文档资料的处理具有很强的功能。awk 名称是由它三个最初设计<BR>者的姓氏的第一个字母而命名的： Alfred V. Aho、Peter J. We i n b e rg e r、Brian W. Kernighan。<BR>a w k最初在1 9 7 7年完成。1 9 8 5年发表了一个新版本的a w k，它的功能比旧版本增强了不少。a w k<BR>能够用很短的程序对文档里的资料做修改、比较、提取、打印等处理。如果使用C 或P a s c a l<BR>等语言编写程序完成上述的任务会十分不方便而且很花费时间，所写的程序也会很大。<BR>a w k不仅仅是一个编程语言，它还是L i n u x系统管理员和程序员的一个不可缺少的工具。<BR>a w k语言本身十分好学，易于掌握，并且特别的灵活。<BR>gawk 是G N U计划下所做的a w k，gawk 最初在1 9 8 6年完成，之后不断地被改进、更新。<BR>gawk 包含awk 的所有功能。<BR>6.1 gawk的主要功能<BR>gawk 的主要功能是针对文件的每一行( l i n e )，也就是每一条记录，搜寻指定的格式。当某<BR>一行符合指定的格式时，gawk 就会在此行执行被指定的动作。gawk 依此方式自动处理输入文<BR>件的每一行直到输入文件档案结束。<BR>g a w k经常用在如下的几个方面：<BR>• 根据要求选择文件的某几行，几列或部分字段以供显示输出。<BR>• 分析文档中的某一个字出现的频率、位置等。<BR>• 根据某一个文档的信息准备格式化输出。<BR>• 以一个功能十分强大的方式过滤输出文档。<BR>• 根据文档中的数值进行计算。<BR>6.2 如何执行gawk程序<BR>基本上有两种方法可以执行g a w k程序。<BR>如果gawk 程序很短，则可以将gawk 直接写在命令行，如下所示：<BR>gawk 'program' input-file1 input-file2 ...<BR>其中program 包括一些pattern 和a c t i o n。<BR>如果gawk 程序较长，较为方便的做法是将gawk 程序存在一个文件中，<BR>gawk 的格式如下所示：<BR>gawk -f program-file input-file1 input-file2 ...<BR>gawk 程序的文件不止一个时，执行gawk 的格式如下所示：<BR>gawk -f program-file1 -f program-file2 ... input-file1 input-file2 ...<BR>6.3 文件、记录和字段<BR>一般情况下，g a w k可以处理文件中的数值数据，但也可以处理字符串信息。如果数据没有<BR>存储在文件中，可以通过管道命令和其他的重定向方法给g a w k提供输入。当然， g a w k只能处<BR>理文本文件（A S C I I码文件）。 <BR>电话号码本就是一个g a w k可以处理的文件的简单例子。电话号码本由很多条目组成，每一<BR>个条目都有同样的