|
Linux新手管理员指南(中文版) Linux Newbie Administrator Guide (Simplified Chinese Version)
幻影快递Linux小组(SLT-Shadowfax Linux Team) 翻译整理 Linux Newbie Administrator Guide 英文原版版权所有:Peter and Stan Klimas. |
第7部分: Linux一些高级应用
本章内容:
banner, script, emacs, vi, nano, diff, patch, grep, regular_expressions, sed, (g)awk, cvs, sort和ascii, gpg(pgp), …
perl, python, tcl/tk/wish, c/c++, kdevelop, glade, ruby, g77, …
dc, bc和“普通”计算器, scilab, 命令行上的随机字符产生
wine, RAID disk tools, network traffic shaping
简介:
本章包含的命令对于新手来说都不是最重要的,但是如果你花时间去学它们的话, 你会获得许多乐趣和创意。除此之外,它们也很富有教育意义,因为LINUX是一个很好的学习平台。LINUX上有很多的免费程序,在你的系统上有一些可能会找不到,这取决于你所安装系统的版本。你总可以用google查到他们的网站然后把他们下载下来。
7.1 LINUX 高级文本处理工具
/usr/games/banner –w79 “Happy Birthday, Marie” > marie.txt 生成一个宽度为79个字符的ASCII码“banner”。结果输出到一个名为“marie.txt”的文件中。这是一个有趣的老式的工具。另一个用于ASCII码文本显示效果的工具是figlet。例如:figlet “Funny!” 在我的终端上将显示如下:(我经常使用固定大小的字体来显示它)
_____ _ | ___ | _ _ __ _ __ _ _| | | |_ | | | | '_ \| '_ \| | | | | | _|| |_| | | | | | | | |_| |_| |_| \__,_|_| |_|_| |_|\__, (_) |___/ script
记录文本终端上当前会话的显示信息到一个名为“typescript”(缺省文件名)的文本文件。按exit或<Ctrl>d终止记录。
emacs&
(在X终端)emacs文本编辑器。高级的复杂的文本编辑器。好象只适用于大师:“emacs不仅只是一个编辑器,它还是生活的一种方式”。Emacs绝对可以说是功能非常丰富亦或者是功能过于膨涨的,这完全取决于个人的观点。通常你的系统上安装了3个版本的emacs。(1)纯文本:在一个文本终端(非X终端)敲emacs命令(我会尽量避免这种情况以防惹火上身);(2)图形方式:在X终端上敲emacs命令(相当有用,即使是新手,只要你花时间去学);(3)X-windows模式:在X终端敲“xemacs”。
vi
著名的或者是臭名昭著的文本编缉器(绝对不推荐新手使用)。退出vi(不保存修改)要敲5个字符:<ESC>:q!<Enter> 我用“kate&”(在X系统下)或者“pico”(命令行)或者“nano”(命令行)文本编缉器,从来不用vi(除非我不得不unmount /usr子系统来修改/编辑一些配置文件,那么vi是唯一可用的编缉器)。另一方面,现在的LINUX发行版本都使用vim(=“vi improved”)来替代vi。Vim在某些方面要优于原来的vi。Vi也有图形界面的版本(在X终端上敲gvim)。下面是我看到的对于批评vi界面不“直观”的一个回答:“只有奶嘴是直观的,剩下的都必须去学习”(许多MS WINDOWS上的应用都属于“直观”的界面) 专家们很喜欢vi,但vi确实很难,除非你经常用它。这里有一个老手对vi的看法(http://Linuxtoday.com/stories/16620.html): “我一开始接触vi是1988年,我很讨厌它。那时我是学校的一名新生。。。vi 看上去太古朴,复杂并且不能被容忍。。。现在已是十二年后了,我喜欢vi,事实上它现在几乎是我唯一使用的编辑器。为何有这种改变呢?我实际上也一直在学用vi,现在我已觉得vi确实是一个强大,功能齐全和适用范围很广的编辑器”
如果你想玩一下的话,你也许可以试一下更古老的行编辑工具ed(只需在命令行上打ed即可).类似这样的工具,尽管不“方便“做交互使用,但是对要在一个程序里对文件进行操作还是很有用的。
下面简短地介绍一下vim(=“visual editor improved”),它是vi的Linux现代版,象一般新手vi只是用来救急,因为有时vi只是我们唯一可用的编辑器。关于vi,很重要的一点是vi是一个“多态“的编辑器。例如,它有一些操作模式,用户在使用时必须要互相切换。下面是一个速查手册,4条最重要的命令用粗体表示。
模式切换的命令: 键 进入模式 说明
<ESC> 命令模式 (从编辑模式返回命令模式)
i “插入” 编辑模式 (在当前光标前开始插入) 在命令模式下不要按其它键。命令模式下还有更多的命令和模式!
复制,剪切和粘贴(在命令模式下): v 开始标记文本。然后,移动光标 y 复制被标记的文本 x 剪切被标记的文本 p 粘贴被剪切或复制的文本
保存和退出(从命令模式): :w 写入(=存入) :w filename 写入文件名为“filename”的指定文件 :x 存入并退出 :q 退出(如果你不对你修改过的文本存盘,你将不会由此退出。) :q! 退出不论是否对文本进行了修改。(在你退出时你不会得到要你存盘的提 示。) nano
这是一个全新的GNU用来代替pico的版本,看上去和工作时几乎和pico一样,但它较小而且更好。它也是属于人们所期待的Linux特许软件(例如,它选用公共许可证,GPL)。它没有包括在RH7.0或MDK7.0里,希望它能很快被加入进来。
khexedit
(在X终端里)一个简单的16进制码文件编辑器。还有令外一个16进制码文件编辑器叫hexedit(它是基于文本的,界面不是很友好)。16进制码文件编辑器是用于编辑二进制码文件(非ASCII或简单文本)的工具。
diff file1 file2 >patchfile
比较两个文件并列出不同,结果存入名为“patchfile”的文件。
sdiff file1 file2
并排比较两个文本文件的不同,并把结果输出到“标准输出”,通常都是屏幕。
patch file-to-patch patchfile
把叫做patchfile的补丁文件(由diff 命令产生,含有两个文件不同点的文件)加载到文件名file_to_patch 中。如果补丁文件由上面的diff命令格式生成,我会用:
patch file1 patchfile file1 , 来把file1变成file2.
grep 过虑器
在文本文件里搜索需要匹配的模版,这个命令的基本用法是绝对值得去掌握的。 一个简单的例子。命令:
cat * | grep my_word |more
将在当前目录下所有文件(文件名以园点开头的除外)里搜索,将文件里含有“my_word”字符串的行一行行地显示在屏幕上。
下面是一个完成同样功能,但更加简练的命令:
grep my_word * | more
模版是由“正则表达式”表式,正则表达式是一种强有力和标准的表示方法。
还有一种是“递归”的grep,叫做rgrep. 它会搜索所有当前目录和当前目录下的所有子目录里的文件,检查是否有文本和模版my_word匹配,并打印出和模版匹配的文本所在相应行。
rgrep –r my_word . | more
正则表达式(regexpr)
正则表达式用于在搜索和替换等操作中进行模式匹配。它们总是和一些实用工具(例如:grep, sed等)以及程序语言(例如:perl)一起使用。Shell 命令dir,就使用了一点正则表达式(下面会提到具体的主要区别)。以下简短的归纳了几乎所有标准正则表达式的特点:
在正则表达式里,大部份的字符都是只和自己本身匹配。因此,如果要搜 索”peter”这个字符串,我就会只用一个搜索字符串”peter”. 除此之外还有 一部份字符被称为“特殊字符”(“原字符”)。它们都有特别的含义。
正则表达式的特殊字符有:“\”(反斜杠),“.”(园点),“*“(星号),”[“(方括号),“^“(尖嘴箭头,只是用于字符串的开始),“$“(美元符,只是用于字符串的结尾)。一个这样的字符通常就注定了一个模版字符串是一个特殊的字符串。
反斜杠,”\” 是一个起“避开”作用的字符。例如,需要匹配一个特殊的字符,我们就把那个特殊字符放在反斜杠之后,以“避开”这个特殊字符的原有功能。因此,“\\“将作为搜索所有含有“\“的字符串的正则表达式, “\.“将搜索所有含有园点的,“\*“将搜索所有含有星号的,“\[“将搜索所有含有方括号的,“\^“将搜索所有含有尖嘴箭头的,即使它在一行字串的开头。“\$“将搜索所有含有美元符号的,即使它在一行字串的结尾。
反斜杠后跟一个正规字符也可能表示一个特殊含意。因此,符号\<和\>分别匹配一个文本字符串的开头前的空字符串和结尾后的空字符串。符号\b匹配一个文本字符串的两边的空串, \B就匹配一个文本字符串里的空串。
园点,“.“,匹配任何单个的字符[dir命令里,在这种情况下,用“?“来代替”.“]因此,“m.a“匹配”mpa“和“mea“,但不匹配”ma“或”mppa“。
任何字符串都可以被“.*“匹配(园点和星号)。[dir 命令用“*“;来代替]。总的来说,任何一个后面跟有“*“的模版会和以这个模版开头后面跟有零个和多个字符的字符串匹配。因此,“m*“会和零个和多个”m“匹配。如果要匹配一个或多个m,我就会用“mm*“。
字符“*“是一个对字符进行重复操作的操作符。其它的进行重复操作的操作符不是象它那样经常使用。下面是所有可以进行重复操作的操作符:
* 被操作的项会匹配0或多次。 \+ 被操作的项会匹配1或多次。 \? 被操作的项会匹配最多一次。 \{n} 被操作的项会匹配正好n次。 \{n,} 被操作的项会匹配n次或n次以上。 \{n,m} 被操作的项会匹配最少n次,最多m次。
尖箭嘴,”^”, 表示一行的开始字符,因此,”^a”就是匹配以字符a开头的行。
美元符,”$”,表示一行结尾的字符,因此,”a$”就是匹配以字符a结尾的行。
下面的命令在一个文件名为“myfile”的文件里搜索以“s” 开头并以”n”结尾的行,然后把结果打印到标准输出(屏幕)上。
cat myfile | grep ‘^s.*n$’
对于那些能使字符串变为匹配正则表达式的特殊字符,如果你想在字串里表示,就需要在它的前面加上一个反斜杠就行了。
方括号,”[“表示一组字符。因此,[abD]的意思就是a或b或D. [a-zA-C]的意思就是a到z和A到C中的任何一个字符。
请注意一些在方括号表示的字符集里的特殊字符。在这个字符集里,这些特殊字符是”[“, “]”, “-“,和”^”, 还有一些组合也是特殊的,象”[:”, “[=” 和”[.”。反斜杠不是特殊字符。
下面是一些有用的字符集的类别(根据POSIX标准的定义):
[:upper:] = 大写字母 [:lower:] = 小写字母 [:alpha:] = 字母,包大小写 [:digit:] = 0 到9 [:alnum:] = 字母加数字 [:space:] = 空白,象<SPACE>,<Tab>和<Newline>都是 [:graph:] = 除了空格以外的可打印的图形字符 [:print:] = 可打印的字符,包扩空格 [:punct:] = 标点符号字符,就是图形字符减去字母和数字 [:cntrl:] = 控制字符,不能打印的字符 [:xdigit:] = 16进制数字
下面的命令搜索dir命令的输出,并把那些含有大写字母后紧跟一个数字的字符串的行打印出来:
dir –l |grep ‘[[:upper:][:digit:]]’
tr(=translation---转化)。 一个用于在文本文件中进行所有同类字符串或者用于“挤压”空格的过滤器。
例子:
cat my_file | tr 1 2 > new_file
这个命令读取文件my_file的类容,并把它们传到用于转化的工具tr,tr这个工具会把文件里所有字符“1”替换成字符“2”,结果会导引到文件名为new_file的文件中。
sed
(=stream editor ---- 流编辑器) 我爱用sed来过滤文本文件。通常用来匹配的模版都是放在一对斜杠//和引号之间的。
比如,如果要打印出含有字串”1024”的行,我就可能会用:
cat filename | sed –n ‘/1024/p’
这里,sed 过滤掉cat命令的输出。选项”-n”告诉sed把那些不符和匹配条件的行都挡在输出结果的外面,对于那些符和条件的行,sed对它们的作用是”p”=打印。
另外一个例子,这次是删除那些被选出来的行:
cat filename | sed ‘/.*o$/d’ > newfile
在上面的例子里,所有以一个字符’o’结尾的行将会被删除。我用了一个正则表答式来表示那些以一个字符’o’结尾的行。输出(比如,所有以字符’d’结尾的行)就会被传到文件名为newfile的文件中。
又是一个例子,这次是搜索和替换,我用了sed的’s’这样一个作用,通常它是放在两个表达式的前面:
cat filename |sed ‘s/string_old/string_new/’ > newfile
更简练的写法是:
sed ‘s/string_old/string_new/’ filename > newfile
在一个html文件里插入一段丛一个文本文件里得来的文本,我可能会用下面的script:
sed ‘/text_which_is_a_placeholder_in_my_html_file/r text_file_to_insert.txt’ index_master_file.html > index.html1
gawk
(=GNU awk. Awk这个命令是一个传统的UNIX 工具。) 一个用于对文本文件进行处理的工具,在很多方面和sed很相似,但是功能更强大。Perl可以做所有gawk可以做的事,甚至更多,因此,我基本上不太用gawk. 简单的任务我会用sed,对更复杂的我就会用perl. 在有些情况下,awk script比相同功能的perl程序短小很多,容易懂和维护,并且更快。
gawk 特别适合用于处理那些文本格式的表格。一个表由记录组成(通常一行就是一个记录)。每条记录含有由界定符分隔开的域。经常用到的界定符有空格(gawk预定),逗号和冒号。所有的gawk命令的格式就是:
gawk’pattern {action}’ my_file.
在命令行里,你可以不要pattern(模版)或者action(作用):预定的模版是“匹配任何东西”并且预定的作用是“打印输出行”。gawk 还可用来做过滤器(用来处理另一个命令的输出,就象我们下面的例子一样)。
把含有字符串“1024”的行打印出来,我会用:
cat filename |gawk ‘/1024/{print}’
就象在sed里一样,用来匹配的模版是放在一对”//”里的。
gawk比sed强的地方就在于它能对域进行操作。$1是“第一个域”,$2是“第二个域”,等等。$0是“一整行”。下一个例子把含有字符串“1024”的行里的第3和第2个域的值读出来,并在每个域的打印出来的值的第一行加上“姓名”和“登记号”这样两个域的标签。打印的最终结果放入一个名为“newfile”的文件中:
cat filename | gawk ‘/1024/{print “Name: “$3 “ID : “ $2}’ > newfile
第三个例子里,gawk 将把那些第三个域的值等于“peter”或者含有字符串”marie”的行找到并打印出来。
Cat filename |gawk ‘ $3 == “peter” || $3 - /marie/ ‘
为了进一步了解最后一个命令,我们把gawk里的逻辑运算符列出如下:
== 等于 != 不等于 < 小于 > 大于 <= 小于等于 >= 大于等于 - 和正则表达式匹配 !- 不和正则表达式匹配 || 逻辑或
&& 逻辑与 ! 逻辑非
cvs
并发版本控制系统。试着用:info cvs 拿到更多的信息。在好几个程序员同时在一个相同的程序上工作时,cvs对“源码库”的版本维护是很有用的。
cervisia
(在X终端里)。一个GUI前端界面的cvs版本管理系统。
file –z filename
确定文件名为filename的文件的类型。选项-z 还要告诉你文件是哪一种压缩文件,如果文件是一个压缩文件的话(不仅仅只是告诉你它是个压缩文件而已)。
为了确定文件的内容的类型,file 命令会在文件的内部去寻找一个特别的文件类型标志(“魔法数”)--- 而不是象在MS windows一样靠文件名的后缀来确认文件的类型。“魔法数”存在一个关于文件类型的数据库的文本文件/usr/share/magic之中。
touch filename
把文件名为filename的文件的日期/时间戳改成当前的时间。如果文件不存在的话,就会产生一个新的文件。你可以把时间戳改成任意你想要的时间,
touch –t 200201311759.30(2002年1月31日时间17:59:30)
在ext2文件系统上每一个文件跟有三个时间值:
---最后一次访问文件的时间(atime) ---最后一次修改文件的时间(mtime) ---最后一次文件的i节点被改变的时间(ctime)
touch将只对文件的前两个时间特性进行修改,最后一个通常总是当前时间。它们都可以用下面提到的stat命令读出来(开下一个说明)
stat filename
打印出一个文件的一般信息(所谓i节点的内容)。
strings filename | more
显示出一个名为filename的二进制文件里含有的字符串。比如说,strings作为检查一个未知的二进制文件的第一步是很有用的。
od (=octal dump --- 八进制输出)。把文件内容以八进制数显示。当一个文件的输出中含有不能打印的字符是很有用的。比如:如果一个文件名含有不能显示的字符是很痛苦的。另外,它对看二进制文件也很有帮助。
例子:
dir | od –c |more
(我可能宁愿用:ls –b 来看含有不能显示的字符的文件名)。
cat my_file | od –c |more od my_file | more
不同输出的比较:
显示一个二进制文件(/bin/sh)的首16个字符,用ASCII码或反斜杠 escapes(八进制): od -N 16 -c /bin/sh
输出:
0000000 177 E L F 001 001 001 \0 \0 \0 \0 \0 \0 \0 \0 \0
同样的二进制用ASCII码显示:
od -N 16 -a /bin/sh
输出:
0000000 del E L F soh soh soh nul nul nul nul nul nul nul nul nul
同样的二进制用简练的十六进制显示:
od -N 16 -t x1 /bin/sh
输出:
0000000 7f 45 4c 46 01 01 01 00 00 00 00 00 00 00 00 00
同样的二进制用八进制输出:
od -N 16 /bin/sh
输出:
0000000 042577 043114 000401 000001 000000 000000 000000 000000
wc
(=word count, 文字记数器)打印出文件的行数,字数和字节数。
例子: dir | wc cat my_file | wc wc myfile
cksum filename 计算文件名为filename的CRC(=“循环冗余校验”)来保证文件的完整性。
md5sum filename 计算文件名为filename的文件的md5校验和(128位)来报证文件的完整性。
mkpasswd –l 10 产生一个长度为十个字符,并很难猜测的随机密码。
sort –f filename 把文件里的行按ascii码的顺序排序。选项-f 用来告诉sort不用考虑字符的大小写。下面是ascii字符集(看man ascii):
如果你对控制符有疑虑,这里是一在控制台上的控制符的含意(来源:man console_codes)。下面每行给出了控制符的助记符,ASCII码的十进制表示,在控制台上显示的组和键和一个简短的描述:
BEL (7, <Ctrl>G) 响铃 (=警报, beep 声). BS (8, <Ctrl>H) 返回一列 (但不会超过该行的开始). HT (9, <Ctrl>I) 水平 tab移动,去到下一个tab开始的地方,如果在行内每有tab, 就去到行尾。 LF (10, <Ctrl>J), VT (11, <Ctrl>K) and FF (12, <Ctrl>L) 所有这三个都给出一个换行.
CR (13, <Ctrl>M) 给出一个回车。 SO (14, <Ctrl>N) 在有LF/NL(新行模式)和回车设定下,击活G1字符集。 SI (15, <Ctrl>O) 击活G0字符集。 CAN (24, <Ctrl>X) and SUB (26, <Ctrl>Z) 中断转义序列(escape sequences)。 ESC (27, <Ctrl>[) 开始转义序列。 DEL (127) 是乎略或删除。 CSI (155) 控制序列导入。
uniq (=unique-----唯一的)去掉已排序的文件中的重复行。例如:sort myfile | uniq
fold –w 30 –s my_file.txt > new_file.txt 用空格将文本文件my_file.txt中的每行截成30个字符,并输出到new_file.txt.
fmt –w 75 my_file.txt > new_file.txt 格式化文件中的每行为75个字符。把超过75个字符的行截短,把少于75个字符的行补齐,但不会移去空行。
nl myfile > myfile_lines_numbered 给文件myfile的每行标上行号。把结果输出给文件myfiles_lines_numbered。
indent –kr –i8 –ts8 –sob –l80 –ss –bs –psl “$@” *.c 通过插入或删除空格来改变“C”源码的外观。上面例子里格式的选项是和Linux 内核的源码的风格是一至的(script /usr/src/linux/scripts/Lindent). 看man indent来了解各个选项的意义。存在的文件先被备份然后就被格式话好的文件给替代了。
rev filename > filename1 打印文件filename, 每行字符以相反顺序显示。上面的例子里结果直接输入到文件filename1。
shred filename 用垃圾字符重复并覆盖文件filename的内容,使任何人都无法再去阅读文件的内容。
paste file1 file2 > file3 按行把两个或多个文件合并,用<Tab>作默认分界符(用选项”d=”来选择自己的分界符)。
如果文件file1的内容是: 1 2 3
并且文件file2的是: a b c d
那么结果file3里的内容就该是:
1 a 2 b 3 c d
join file1 file2 > file3
把两个文本文件里有相同域的行连成一行。Join和数据库的“表连接”操作是类似的,但它只是对两个文本文件进行操作。默认的分界符是空格。如果你想用其它的操作符,你可用man join去查看里面的选项。
如果file1里的内容是:
1 Barbara 2 Peter 3 Stan 4 Marie
并且file2的是: 2 Dog 4 Car 7 Cat
那么结果file3就该是: 2 Peter Dog 4 Marie Car
des –e plain_file encrypted_file (=”Data Encryption Standard” 数据加密标准)加密文件plain_file。你会被要求输入一个键值用于加密算法使用。加密后的结果存放到文件”encrypted_file”。解密就用: des –d encrypted_file decrypted_file.
gpg “Gnu Privacy Guard-----GNU 的私人警卫”—一个和PGP(“Pretty Good Privacy” )功能一样的免费软件。gpg比PGP更安全并且没有使用有专利的算法。gpg主要用于给你的email加签名并且检查其它信息的签名。你也可用它来给你的信息加密解密。http://www.gnupg.org/上有所有的详细信息,包括一个易读和详细的手册。
开始,我需要一对匙值:个人匙和公共匙。个人匙用于给我的信息签字。公共匙用于传给他人来确认我的信息的签名在他们收到我的信息后来确认我的信息的签字。(某人还可用公共匙来给信息加密这样这个信息就只能通过我的个人匙结密并阅读)。我用下面的命令来生成这一对匙值:
gpg –gen-key
我的匙会存放在目录~/.gnupg下(它会被我用一个密码值加密在我生成匙值的过程中)。在一个纯文本文件中显示我的公共匙的值,我用: gpg –armor –export my_email_address > public_key_stan.gpg
它会生成一个含有如下类似内容的文件public_key_stan.gpg
.....BEGIN PGP PUBLIC KEY BLOCK..... Version: GnuPG v1.0.1 (GNU/Linux) Comment: For info see http://www.gnupg.org mQGiBDmnzEYRBACoN438rxANaMfCy5bfj6KWM0/TR6x6HZ0gpmhGeuouM/SOR2IU /G30NdCuzHeFs93BhtY0IdzoEMtMyZHnvdhZC2bx/jhgaaMbEaSsXwRhVB0xVPYx rHbsgSULHYzRFF34MS3/Lse3QWfWxzA7I0lbXB7nLwZKZqaNONRFRR42owCg60hV TDPEB2N0llMyt12R4ZByFSsEAJ1tE7pb9b6TP7cw21vkIjc+BI2uSzn/B4vNlCWK TTuZHVv0w0jFcbd8DB0/1tlZUOrIzLSqJyQDGiNn258+7LetQ+LKG/1YKbiAcosz 4QirBuLIeF2M9GuXYCwZypE3Dwv+4YupvybR31CgLTJ8p4sKqC5n0eSr2oSrtdHZ yuJtA/9v2HcebOncfCNOK+cVRmcTB1Frl/Gh/vNCfeZyXaJxlqDfCU2vJHtBemiE AtcfZHB/iHy0DM68LfRJSAIFAa5um9iWHh5/vWCGZLqtpwZ7kyMw+2D6CFkWATsy wQA1g1VcGkNc14Crrd36qf60bI+b8pn2zDhwZtLsELsXyXkNhbQmU3RhbiBKIEts aW1hcyA8U3RhbktsaW1hc0B3ZWJoYXJ0Lm5ldD6IVgQTEQIAFgUCOafMRgQLCgQD AxUDAgMWAgECF4AACgkQt+ZBooH8bHd2kwCghAt9aKIk0mRJv+g7YcRPotVtrwkA n1a4xEVEyaKgKoMaJnopf69K9+vouQENBDmnzH4QBADgFpLP+tWZPnVYg47cn+9b XQRjdOtNsDE6BYH872/sR1oCrdH6k+gXFOiZxRZ3PElK2/olo59kh5xa9aBxNdEC FuXJN0UelmhOFbDtqVksIqVWyYfXnLz+wtcXg0Q0L0q8vY4IuTzw2WkV6EkM+/x8 6UhA2XVaMJKBdRKFSVilbwADBQP+JCzLj5HDgpRvf+KM72nzSg7sp8Tki7nF9wNA PODK0SeQgI3dwXYyF6AVenlETE/3xRWoYQN1bxVZsOex9vzqPrQC3dR0NBljd74r kfXwUTl2fNQX4N9iuVCo2gCGbi5+gfEk1GhsWDsq0z40f+18k+XBdWmY8sCNiolT tnvm1QeIRgQYEQIABgUCOafMfgAKCRC35kGigfxsd9SGAJ9/FWSkEfgbE/Yc46d8 Ef1gYg3I1ACff3oLeAMeGGO79gW6UGp9RJ6mRao= =X1k2 .....END PGP PUBLIC KEY BLOCK.....
现在我可以把我的公共匙email给那些我希望能安全的交流的人。
他们可以把他存放在他的pgp系统上:
gpg –import public_key_stan.gpg
甚至可能更好,我可以把我的公共匙提交给一个公共匙服务器。我用下面的命令来寻找我就近的服务器:
gpg –keyserver wwwkeys.pgp.net –send-keys
“wwwkeys.pgp.net”是我选的匙服务器,并且linux_nag@canada.com是我的email地址,用于在本地的匙圈对我的识别。我只需要提交给一个公共服务器即可(其它会与这个服务器自动同步).
现在,我可以开始使用gpg。如果要手工地给一个文件my_message签字,我会用:
gpg –clearsign my_message
这个会产生一个文件my_message.asc,并含有如下内容:
.....BEGIN PGP SIGNED MESSAGE..... Hash: SHA1
Hello World!
.....BEGIN PGP SIGNATURE..... Version: GnuPG v1.0.1 (GNU/Linux) Comment: For info see http://www.gnupg.org
iD8DBQE5p9+3t+ZBooH8bHcRApn/AJ9kx9+pU3GJBuvJN9Bo3bW3ku/5PwCgquht mfrPrt7PQtdmGox72jkY0lo= =rtK0 .....END PGP SIGNATURE.....
如果要确认一个签过名的文件,我会用:
gpg –verify my_message.asc
如果你的文件即使有很小的改变,签名检查不会被通过。
手工签名是笨拙的,但是,举例来说,kmail就能自动为我做电子签名。
“docbook”工具集
Docbook是近来文件保管的标准。Docbooks 工具集包含在RH6.2的“jade”软件包里,它还包有如下转换工具:db2ps,db2pdf,db2dvi,db2html,db2rtf,这些工具能把docbook文件转成:postscript(*.ps),Adobe PDF(*.pdf), DVI(*.dvi), HTML(*.html)和RTF(*.rtf)格式。
“文件保管“就是文件的格式能自动转成其他的有用格式。比如说,有一个正在完成的文件,在将来,它可能考虑被作成一个报告的形式,一个年报的形式,一个报纸里的文章的形式,一个网页,还也可能是一本书的格式,我(作者)现在还不能确定它。用“固定的代码“(字体,字体大小,分页符,行中置符,等等。)来设置文件的各式其实是浪费时间的---特别文件类型的各种各样的风格是和出版者相关的。解决的方法是用那些“逻辑”上的排版元素象文件标题,章标题,小章标题,强调风格,图片名,字幕和表,等等。这就是“docbook”做的事情—它是一种风格的描述(用xml,html的一个优集,并且与sgml有关)--因而也被称作风格单。在文件出版的时侯,文件的格式就会依照逻辑版面的定义实际显示出来。
当我们学习如何使用docbook的时候,我们会对这一段里的内容进一步详细说明。
7.2 LINUX 下的简单编程
perl 强大和广泛使用的脚本语言,在大师们当中很流行。Perl 看上去很神秘,但如果你用它来完成一些简单的任务,它其实是相当直接的。对于简单的编程而言,Perl就象一把瑞士军刀。Perl的语法和C语言很象。在MS-Windows下Perl也有一个一流的解释器,所以你写的代码是可以跨平台的。Eric Reymond(著名的linux大师)是这样描述perl的:“Perl,显然是现代脚本语言里面的一个800磅的大猩猩。它大部分被系统管理员用于替代shell脚本语言,一部分这要归功于它对UNIX库函数和系统调用的包容,另外这也要归功于非常活跃的Perl社区开发的大量的Perl模块。在网上85%的“活”的内容的后面估计都用了它来作为CGI语言。Larry Wall,它的创建者,被任为是开放代码源社区的重要领导者之一,并且总是被任为是黑客崇拜者的罗马神殿里仅次于Linus Torvalds和Richard Stallman排名第三的人物。”
我怎样写一个简单的perl 脚本?
我可能会用pico(或其它任何我想选用的文本编辑器)来输入一个简单的perl 脚本:
pico try_perl
下面的脚本例子没有任何用处,只是用来说明perl的一些基本特征:
#!/usr/bin/perl -w # a stupid example perl program # the lines starting with # are comments except for the first line # names of scalar variables start with $ $a=2; $b=3; # each instruction ends with a semicolon, like in "c" print $a**$b,"\n"; $hello_world='Hello World'; print $hello_world,"\n"; system "ls";
第一行告诉shell如何执行我的文本文件。选项“-w”会让perl输出更多的警告信息等,这可能会对你调试你的脚本程序有用。下面三行(以#开头)是注释。再下面的几行大部分是用于自我解释的:我给两个变量($a和$b)赋值,把$a再$b次方并把结果打印出来。字符“\n”打印一个新行,就和C语言一样。然后我再定义一个新的变量,把字符串“Hello World”赋给它,再然后,我把这个变量打印出来。最后,我运行一个本地操作系统的命令“ls”,它在linux里用于显示当前目录的内容。这真是一个傻傻的脚本程序。
在存好这个文件后,我会把它变成可执行的:
chmod a+x try_perl
我现在输入如下命令来运行这个脚本程序: ./try_perl
下面是一个稍长一些作起来很简单,但又对我很有用的一个脚本程序。我有一个由某个数据获取系统生成的大型文本文件。我需要每隔一行就删除一行,这样我就能将这个文本文件填满我的MS Excel文件:
#!/usr/bin/perl -w # Create a text file containing a selection of lines from an original file. This is needed # so that data for manual postprocessing are fewer. # # Prompt the user for the filename, and the selection of lines to preserve in the output. print STDOUT "Enter the filename: "; chomp($infile=<STDIN>); open(INFILE,"<$infile"); # open the file for reading. print STDOUT "Enter the number of initial lines to preserve: "; chomp($iskip=<STDIN>); # the first lines may contain column headings etc print STDOUT "Enter the skip: "; chomp($skip=<STDIN>); # # The name of the output file is created automatically on the basis of the # input file and the selection of lines. It is always of type CSV, so preserve is so. $outfile=$infile.'.pro'.$iskip.'.'.$skip.'.csv'; #glue strings together using the dot operator open(OUTFILE,">$outfile"); # open file for writing. # # write the "initial" lines to the output file. for($a=0;$a<$iskip;$a++) { $line=<INFILE>; print OUTFILE $line; } # # do the rest of the file $c=0;$w=0;$skip++; while($line=<INFILE>){ $c++; if(!($c%$skip)) { #use % for remainder of integer division print OUTFILE $line; $w++; } } # close(OUTFILE); print STDOUT "Read Lines: ", $c+$iskip," Wrote lines: ", $w+$iskip,"\n";
python 现代的和非常优雅的面向对象的解释器。它是强大的并且比perl有更好的可读性。在网上可以找到由创造者G.van Rossum写的很好和很大的手册。(可以试着去http://www.python.org/doc/浏览或去ftp://ftp.python.org去下载)。
我如何写一个简单的Python程序?
编辑一个含有你的Python程序的文本文件。我会用kde的“kate”编辑器来作(在X-Windows下)
kate try_pathon.py &
在里面输入简单的python代码来看一下它的工作情况:
#!/usr/bin/env python print 2+2
第一行(以“#!”开头)告诉shell如何执行这个文本文件――它必须在那里用于告诉Linux这个特别的文本文件是一个Python脚本。第二行是Python的一个简单表达式。
在存好这个文件后,我让它变为可执行的:
chmod a+x try_python.py
然后我就打下面命令来执行:
./try_python.py
Python 是很好和很现代的程序语言。如果你喜欢面向对象的程序设计,不妨一试。在因特网上有它的很多库和扩展。比如说:
科学计算的python(http://starship.python.net/crew/hinsen/scientific.html) 数学计算的python(http://sourceforge.net/projects/numpy),在工程领域应用广泛。
下面是一个有一点长,但希望能自我解释的python代码。一个短的说明:python的流程控制依靠代码的缩排―――它使得程序更容易读,看上去更自然,但需要花一些时间去习惯它。
#!/usr/bin/env python # All comments start with a the character "#" # This program converts human years to dog years # get the original age age = input("Enter your age (in human years): ") print # print a blank line # check if the age is valid using a simple if statement if age < 0: print "A negative age is not possible." elif age < 3 or age > 110: print "Frankly, I don't believe you." else: print "That's the same as a", age/7, "year old dog."
tcl (发“tickle“这个音)很流行的脚本语言
一个简单的tcl程序?
#!/usr/bin/tclsh puts stdout {Hello World!}
wish (在X终端上输入)这是一个Tk(tcl在X窗口上的扩展)的前台语言。常常用于生成一个程序的前台。
我如何用Tk写一个图形界面的程序?
Tk是简单但功能强大的tcl程序设计语言的图形界面扩展。例如,我用pico生成一个含有简单tk程序的文本文件:
pico try_tk
然后在里面输入简单的tk代码,看看它是如何工作的:
#!/usr/bin/wish button .my_button .text "Hello World" .command exit pack .my_button
第一行(以“#!”开头)告诉shell用哪个工具来执行这个文本文件。下面两行是简单的tk程序的例子。首先,我生成了一个按钮叫作“my_button”并且把它放在我的类层次的根部(在“my_button”前用园点表示)。对于按钮,我在上面显示文本“Hello World”并关联上一个退出程序的命令(在按下按钮的时候)。最后一行来调整我的程序的窗口大小使它正好能放下我的按钮。
在给文件存盘后,我把它变成可执行的:
chmod a+x try_tk
然后我用下面方法执行(需要在X终端下,因为它需要X窗口的运行):
./try_tk
对于建立GUI的前端,Tk是很流行的。
ruby 一个纯的面向对象的脚本语言。相对来说,它还比较新,但它正快速的流行起来,并有可能成为将来很受欢迎的语言。
为了写一个简单的ruby程序,我会用我喜欢的文本编辑器来编辑并在第一行放上如下一行: #!/usr/bin/ruby
下面是一个简单的例子来帮助我理解一些ruby的基本概念:
#!/usr/bin/ruby #This is a comment a = Array.new print "Please enter a few words (type EXIT to stop):\n" i = 0 while enterWord = STDIN.gets enterWord.chop! if enterWord == "EXIT" break end a[i] = enterWord i += 1 end #sort the array for i in 0...a.length.1 do for j in i+1...a.length do if a[j] < a[i] tmp = a[i] a[i] = a[j] a[j] = tmp end end end #Output the results print "You entered " + a.length.to_s + " entries.\n\n" for i in 0...a.length do print "Entry " + (i+1).to_s + ": "+ a[i] + "\n" end
我把我的ruby脚本程序存为文件“myprogram”,我在命令行里输入下面来执行它:
./myprogram
gcc filename.c GNU的C编译器。如果你了解C的话,它是很直接明了的。网上有大量的手册。
我如何编译一个简单的C程序?
打开一个你喜欢的文本编辑器并输入你的源码。例如,我可能会用pico:
pico hello.c
然后输入Kerningham和Richie(“c”的发明者)的C程序的启萌例子:
#include <stdio.h> void main(void) { printf("hello world\n"); }
把文件存好然后开启GNU的C编译器来编译文件“hello.c”:
gcc hello.c
gcc编译器会产生一个可执行的二进制文件“a.out”, 可用如下方式运行:
./a.out
g++ filename.C GNU的C++编译器。大写字母“C”总是用来表示C++源码。如果你需要一个“集成的系统开发环境(IDE)”,你可以试者用一下kdevelop.
我如何编译一个简单的C++程序?
就象在c里面一样,我打开一个文本编辑器并且写入我的程序。例如,用pico, 我写入如下程序:
//This is a comment (to the end of line, C++ style) #include <stdio.h> #include <math.h> #include <iostream.h> #include <stdlib.h> //define a function double wheeldrop (double dGap, double dDiameter) { double dDrop, dRadius, dNotDrop; dRadius = dDiameter * 0.5; dDrop = dRadius . sqrt( (dRadius*dRadius).(0.25*dGap*dGap) ); return (dDrop); } //end of the function //The function main is the entry point to the program void main(void) { double dGap, dDiameter, dDrop, dRadius, dNotDrop; //variables for (;;) { //infinite loop cout << "Please enter gap between track segments and \n" << "diameter of train wheel in inches (.1 .1 to exit): "; cin >> dGap >> dDiameter; if ((dGap == .1) && (dDiameter == .1)) break; else if (dGap < dDiameter) { //do calculations dDrop = wheeldrop (dGap, dDiameter); printf ("The wheel will drop %f inches.\n\n", dDrop); } else { printf ("Error, your train is going to crash.\n Gap bigger then wheel!\n\n"); } } }
我把文件存为“train.C”, 然后打开GNU的C++编译器来编译“train.C”并把它生成名为“traincalc”的执行文件:
g++ -o traincalc train.C
我用下面方式来执行:
./traincalc
kdevelop (在X终端里输入)K的集成开发环境。很值得去下载(如果你的软件不包含它的话)
glade (在X终端里输入)用户界面的图形生成器。
“Glade是由Damon Chaplin开发的一个界面生成器。它允许Gnome/Gtk图形用户界面的图形和交互的构造。从Glade, 生成的界面可以存为一个xml文件或是在C的source tree里的C代码。Glade还允许定义处理器函数的定义――用于附上界面上的各种各样的事件。例如,当一个菜单上的某一项被按下时,就会去调用一个函数(名)。”(选自:http://linuxtoday.com/news_story.php3?ltsn=2000.07.16.013.04.PS.GN)
Linux下有哪些C函数可用于编程?
象我这样的新手,这样的函数太多了。我从研究目录/usr/include及其子目录下的头文件(*.h)开始。为了查找一个含有给出函数(例如:cosh)的原型的头文件,我会做下面类似的事:
cd /usr/include grep –H “cosh” *.h
还有很多有趣的库都不是跟着标准软件配制来的,例如,GNU的关于科学计算的库(GSL):http://sources.redhat.com/gsl 或者去 http://www.phy.duke.edu/~hsg/sci-computing.html
as nasm ndisasm (三条命令)。汇编,一个“原汇编”和一个反汇编。下面试着给你们这些新手看一下如何使用:-)
例如:ndisasm /bin/sh |more在我的系统上(在这个例子里用/bin/shSHELL)从二进制文件产生了一个很长的“汇编助记符”的输出,但我是一点也看不明白的:-( 如果你想了解更多的nasm,你可能会看文件:/usr/share/doc/nasm-doc-0.98/html/nasmdoc0.html
这是一个对Linux2.2.17或更高版本的intel汇编的例子:
;; hello.asm: Copyright (C) 2001 by Brian Raiter, under the GNU ;; General Public License (version 2 or later). No warranty. BITS 32 org 0x05936000 db 0x7F, "ELF" dd 1 dd 0 dd $$ dw 2 dw 3 _start: inc eax ; 1 == exit syscall no. mov dl, 13 ; set edx to length of message cmp al, _start . $$ pusha ; save eax and ebx xchg eax, ebx ; set ebx to 1 (stdout) add eax, dword 4 ; 4 == write syscall no. mov ecx, msg ; point ecx at message int 0x80 ; eax = write(ebx, ecx, edx) popa ; set eax to 1 and ebx to 0 int 0x80 ; exit(bl) dw 0x20 dw 1 msg: db 'hello, world', 10
在把它存为一个文本文件hello.asm后,我可以用下面的命令编译并输出到“hello“然后让它成为可执行的:
nasm –f bin –o hello hello.asm && chmod +x hello
下面我执行它:
./hello
这个例子我是从http://www.muppetlabs.com/~breadbox/software/tiny/借来的。
为何某些人要用汇编?在汇编下编译后,我的系统上这个可执行文件的大小是56字节。用“C“写的同样功能的程序编译后可执行文件的大小是13.7K个字节。
这里有一些简短的信息来帮助我理解上面的程序:
“;” 加注释(只到行尾)。 “msg:” —一个标号的例子(就象在Fortran里一样) org (=“origin”(来源))――声明程序在内存里的开始地址(在被执行并调入内存时)。 db,dd,dw 是汇编的“伪指令“用来在输出文件里查入初始值。 “$” 求出含有表达式的行的起始位置,因此你就可以用“JMP $”来表示一个无限循环。“$$“求出当前节的起始位置。
在80x86(“Intel”)里的32位通用寄存器有:EAX,EBX,ECX,EDX,ESI,EDI,EBP和ESP。(字母“E”表示扩展。它在名字的前面是因为它能用作16位的寄存器但我们只需把名字叫作:AX,BX,CX,CX,SI,DI,BP和SP。同理,它们也可视作8位寄存器:AL,AH,BL,BH,CL,CH,DL,DH. 这里,“L”和“H”分别表示“高”和“低”的字节)。
一些80x86通用处理器的指令记忆码的说明:
名字 语法 注解 NOP NOP 不做任何事 MOV mov destination, source 转移(考备,设置)数据 XCHG XCHG operand1,operand2 交换值 CMP CMP operand1,operand2 比较两个操作数 PUSH PUSH source 推上栈(把值放上栈并把栈的指针增加). PUSHF PUSHF 推的标记 PUSHA PUSHA 推入所有通用寄存器 POP POP destination 从栈里弹出(从栈里取值,并把栈的指针减少)。弹出是栈的反操作。 POPF POPF 弹出标记 POPA POPA 弹出所有通用寄存器 INC INC operand 加一 DEC DEC operand 减一 ADD ADD Dest,Source 加 ADC ADC Dest,Source 加并存放 SUB SUB Dest,Source 减 INT INT number 执行中断 CALL CALL subroutine 调一个子例程 RET RET 从当前或最内的子例程返回 JMP JMP destination 跳到目的地址执行 JE JE destination 如果相等就跳离 JNE JNE destination 如果不相等就跳离 JZ JZ destination 如果是零就跳离 JNZ JNZ destination 如果非零就跳离 JP JP destination 如果有奇偶校验就跳离 JNP JNP destination 如果无奇偶校验就跳离 JPE JPE destination 如果奇偶校验是偶就跳离 JPO JPO desitination 如果奇偶校验是奇就跳离 JCXZ JCXZ destination 如果CX寄存器是零就跳离 JECXZ JECXZ destination 如果ECX寄存器是零就跳离
guile “Scheme”程序语言的一个实现。Scheme是LISP语言(在过去40年一只是人工智能的主哉语言)的一个现代的方言。
一个小的guile解释器的例子:
guile (+ 1 1) (define a 2) (/ a 3) (= a 7) (display "hello\n") (system "ls") (exit)
第一个命令运行guile的解释器。后面的四个命令作加法,定义,除法和比较,用的是波兰表达式(操作符在操作数之前)。看在这页里的逆波兰表达式。最后的命令是退出解释器。
g77 GNU FORTRAN. 网上的手册在:http://gcc.gnu.org/onlinedocs/g77/. 如果你真的需要很了解FORTRAN,你可能需要到下面网址:http://studbolt.physast.uga.edu/templon/fortran.html去找一个符合你的需要的Linux下的FORTRAN编译器。
一个Fortran代码的小例子,它打印出1到20的数的平方和立方。
PROGRAM TRY_FORTRAN INTEGER X PRINT 200, "X", "X^2", "X^3" DO X=1, 20 PRINT 100, X, X**2, X**3 END DO 100 FORMAT (I20, I20, I20) 200 FORMAT (A20, A20, A20) END
为了编译这个文件,我运行fortran的编译器并使用选项来认识“自由格式”的源码(我不喜欢固定格式的源码):
g77 –ffree-form try_fortran.f
现在我运行它(编译执行文件的默认文件名是a.out)
./a.out
expect “程序对话”的脚本语言。看man expect
kylix 这是由Borland(aka Inprise)提供的全新(Feb 2001)的商业软件。简短的说,它就是著名的面向对象的Pascal(“Delphi”)的Linux的移植。kylix不会在你的linux的cd上,你必须为它付钱,但是如果你想在Linux,MS Windows 和 Web,大量的预置件等之间做最好的快速应用程序开发的代码移植,kylix几乎是最好的。在我看来,Delphi明显比MS Visual Basic好很多。
javac Java语言的编译器和解释器。在Linux下,javac和java实际上是用合适的选项调用kaffe的脚本(试一下cat /usr/bin/java)
一个java“单独”的小试验程序。我用我最爱的文本编辑器,例如kate(在X终端下)输入如下java代码:
/* Comments are marked like in C++ * A java class to display "Hello World" */ class HelloWorldApp { public static void main(String[] args) { System.out.println("Hello World."); // Print "Hello World." followed by a newline } }
我把它存入一个名为try_java.java文件中,现在我开始编译它:
javac try_java.java
编译产生了一个叫作HelloWorldApp.class的“字节码”文件(编译一半的文件,执行时须用解释器)。我输入下面命令运行:
java HelloWorldApp
如果想看如何把一个简单的java applet嵌入在网页里的例子,你可以去下面网站看一下:http://java.sun.com/docs/books/tutorial/getStarted/cupojava/unix.html,上面的例子就是从那里借过来的。
make 运行“make”这个工具是用来建立(编译,联接等)一个项目,这个项目在当前目录下的Makefile文件里有描述。
Make用来让系统“更新”,当系统中的一个文件有改变,所有需要的对系统的更新操作都由Make完成。make是“智能”的,它不会对那些不需要改变的文件去进行变化,通常这些文件的改变是由文件的时间来确认的。一般来说,它用于建立软件包(编译,联接……),make还可以做其它的任务,例如,系统管理。Makefile看上去象下面这样:
target : prerequisites [Tab]commands
这里,目标通常都是一个文件(但也不绝对),prerequisites是target文件所需要的文件。如果target不存在或者比任何一个prerequisites旧的话,“commands”就会执行。上面的第一行被叫做“归则”,第二行叫做“动作”。请注意任何一个动作行必须以tab字符开头。下面是一个例子,Makefile生成一个叫作“edit”的执行文件:
my_program : main.o command.o cc .o my_program main.o command.o main.o : main.c defs.h cc .c main.c command.o : command.c defs.h command.h cc .c command.c clean : rm my_program main.o command.o
为了用这个Makefile来生成一个执行文件叫作“my_program”, 我打:make。它会在后台工作来确认它所需要的文件,这样,首先,它会编译 “command.c”成目标文件“command.o”,然后再编译“main.c”成“main.o”,最后它把“main.o”和“command.o”联上执行文件“my_program”。另外还可用这个makefile去删除目录下的所有执行文件和目标文件。我们只要打:make clean即可。由于目标“clean”不需要依赖其它前提,它不会在通常调用里执行,而是需要很清析的调用。目标“clean”就是一个“假”目标的例子。
yes 生成一个含有“yes”并用不结束的字符串的输出(可按<Ctrl><c>终止或掉电)。 听上去象是一个很蠢的工具,但它可用于在命令行写一个很简单的程序。例如,下面这个用于确定在100,000个随机数里各个数字出现的频率的例子(所有的命令在一行上):
yes | sed '100000q' | awk 'BEGIN{srand();u=6*log(10)}{printf"%e\n",rand()*exp(rand()*u)}'| cut -c1 | sort | uniq -c
我不希望这个例子会把你吓着―――它确实说明了过时的UNIX的命令行操作同样可以玩得很复杂(和功能很强),就象你所期待的一样。如果你想知道为什么数字出现的频率是各种各样的(直觉上来说如果数字是随机的,它应该是一个常数)就到我借来这个例子的网站上去看一下吧:http://www.newscientist.com/ns/19990731/letters4.html
7.3 数学工具
dc 一个任意精度的命令行“逆波兰表达式(RPN)”计算器。
dc 来自现代数字计算机的主要概念-堆栈。计算机中的堆栈和厨房里的一叠盘子没有什么不同:最后进来的最先出去(即LIFO,亦称后入先出)。它和先入先出(FIFO)的队列正好相反。
你只能对位于堆栈顶部的数值执行运算。两个最基本的运算是:压入(在堆栈顶端置入)和弹出(从堆栈顶端取回)。一元运算从堆栈中弹出一个数值(“一元”指“要求一个操作数”),二元运算从堆栈中弹出两个数值(“二元”指“要求二个操作数”),三元运算从堆栈中弹出两个数值(“三元”指“要求三个操作数”)。每种情况下,运算结果总是被压回堆栈的顶部。
逆波兰表达式计算器(普通手持式)在技术人员和学者中很常见。它从不要求输入圆扩号。
历史 无扩号逻辑是由波兰数学家Jan Lukasiewicz (1878-1956)在第二次世界大战前发明的。起初,运算符位于操作数之前。但为便于计算机使用,运算符被置于操作数之后,这也就是“逆波兰表达式”中“逆”字的由来。
下面练习对堆栈操作: dc [启动任意精度逆波兰表达式计算器] 1 [将数值“1”压入堆栈] 2 [向堆栈中压入另一个数值] 3 [向堆栈中压入另一个数值] 4 [向堆栈中压入另一个数值] f [显示整个堆栈的内容;你应该看到 1 2 3 4] p [显示堆栈顶部的数值但不改变堆栈本身;你应该看到4] + [执行加法运算(二院运算),即将最上面的两个数值(4,3)弹出堆栈,然后在把运算结果(7)放入堆栈] p [显示堆栈顶部的数值;例如,刚才加法运算的结果(7)。] p [再次显示堆栈顶部的数值以证明堆栈的内容没有被刚才的显示操作(p)改变。] * [执行乘法运算(二元运算);即弹出堆栈中的最后两个数值,然后将运算结果(14)放入堆栈] p [显示刚才乘法运算的结果(14)] P [弹出堆栈中的最后一个数值 (14)] p [显示堆栈顶部的数值] 2000 [向堆栈中压入一个较大整数] k [为堆栈顶部的数值(例如:2000)设置精度] 1 [向堆栈中压入另一个数值] f [显示整个堆栈的内容] 701 [向堆栈中压入另一个数值] / [堆栈中的最后两个数值执行出发运算,例如:2000除以701] p [显示最后除法运算的结果] q [退出任意精度逆波兰表达式计算器]
请注意,逆波兰表达式从不需要扩号。可以阅读dc的联机帮助(man bc)了解更多功能。
bc 任意精度交互式计算器。输入“quit”退出bc。在进行浮点除法运算前输入“scale=20”(或其他精度),否则将得到取整后的商值而不是一个浮点数。
kcalc& xcalc& (X图形终端上)标准图形界面计算器。
e '2*3/4+sin(pi/2)'
这个“e”表达式求值程序不包含在RedHat 7.x的光盘中。不过,在众多的命令行计算其中我最喜欢这个。可以试着从这个地址下载:http://www.softnet.tuc.gr/~apdim/projects/e/
expr 1 + 1 / 3
执行整数运算。“expr”并不意味着一个计算器,大多数情况下在脚本程序中用做流程控制。上面的例子回返回结果“1”,因为在整数除法中1/3等于0是正确的。
octave
octave是一种用于数字计算的高级交互语言,非常接近“matlab”,包含在任何完整的Linux发布中。
scilab&
(X图形终端上)一个强大完善的数字计算系统,在一定程度上与“matlab”相似, 但有一个更加紧凑的图形界面。如果不是有非常复杂的运算要求就不要去试它了。这个软件包含在RadHat 7.0“powertools”光盘中。主页:http://www-rocq.inria.fr/scilab/
下面的小例子示范了一些线性代数运算,我的输入用黑体表示: -->a=[1 1 1;2 3 4] a = ! 1. 1. 1. ! ! 2. 3. 4. !
-->b=[1 1; 2 2;3 3] b = ! 1. 1. ! ! 2. 2. ! ! 3. 3. !
-->c=a*b c = ! 6. 6. ! ! 20. 20. !
-->d=inv(c) d = 1.0E+14 * ! 11.258999 - 3.3776997 ! ! - 11.258999 3.3776997 !
-->
head -c 8 /dev/random cat /dev/random | od cat /dev/urandom | memencode
(三个命令)例子显示了如何在Linux命令行通过读设备“random”或“urandom”生成随机字符。第一个命令通过读设备“random”产生大约8个字符,这样能产生高质量(难于预测)的随机数。这个过程会变得很慢,如果你的机器“随机信息”已经用尽的话(比如,当产生大量的随机字符)。这是的解决办法是等待或者用键盘任意输入、移动鼠标、切换终端、让你的硬盘读写等来生成等多随机噪音(“随机信息”)。第二个命令不断地产生随机字符,但以八进制显示。它只能用Ctrl+c来中断。第三个命令使用了设备“urandom”,但生成大量随机字符的时候比“random”快。当系统的随机信息少时,“urandom”的输出的随机程度可能会下降,但除了一些有特殊要求的应用程序外,仍能满足绝大多数的情况的要求。输出被过滤成可打印的MIMIE格式(互联网上用于邮件的7位编码标准)。Linux下的详细的随机数生成原理和实现描述源代码可以在你的linux系统/usr/src/linux/drivers/char/random.c文件中找到。
factor 10533858466222239345
查找任意整数的所有质因数(素数)。一个整数的因数是能够整除这个整数的数。例如:6的因数有:1,2,3和6。
R
一种针对复杂的统计计算的编程语言/计算环境。输入“quit()”退出。
gnuplot
图表创建工具。非常适合非交互式(批处理)任务,但对交互式使用并不简单。你可以在http://www.duke.edu/~hpgavin/gnuplot.html找到很好gnuplot说明。
7.4 杂项
我怎样才能够运行微软Windows程序(用“wine”)?
不要为了运行微软Windows程序而安装Linux。如果需要Windows程序,你可能想把你的计算机配置成双重启动。
当然,Linux下的“wine”库可以让你运行某些微软Windows程序,尽管是以牺牲速度为代价。在我的系统上(安装了Wine),我能通过在X Windows的终端窗口中输入:
wine /mnt/dos_hda1/windows/sol.exe
运行微软的纸牌游戏。
其中,/mnt/dos_hda1是可以并且已经挂接微软Windows所在硬盘分区的目录名。
如果你还没有安装Wine, 那就将Mandrake 光盘放入光驱并让系统识别到它,然后以系统管理员的身份(root)执行:
cd /mnt/cdrom/Mandrake/RPMS/ rpm -ihv wine-991212-1mdk.i586.rpm
Mandrake软件包能够与RedHat兼容,所以你可以用它来安装RedHat缺少的软件包。
如果我有两个或更多的硬盘,能够使用RAID吗?
RAID=“冗余磁盘阵列(Redundant Array of Inexpensive Disks)”。RAID能够用一块磁盘去镜像另一块磁盘以达到在发生磁盘损坏的情况下保护数据、维持系统正常运转的目的。Linux包含了一套RAID工具供你定制一个符合你要求的RAID系统。它们包括:
mkraid–初始化/升级RAID磁盘阵列 raid0run– 启动老式(无超级块)RAID0/线性阵列[译者注:原文如此。意即通常所说无镜像] raidstart– 启动RAID设备 raidstop– 停止RAID设备 raidtab– RAID设备配置文件
RAID把两个或更多磁盘合成一个单独的逻辑设备。不同级别的RAID有:
RAID 0 (条状)简单地把两个或多个磁盘合成一个单独的逻辑设备,没有任何冗余。经常和RAID1及RAID5一起使用。RAID0 + RAID1被称作RAID10,RAID0 + RAID5 被称作RAID50。
RAID 1(镜像)结合两块磁盘,每一块磁盘存储相同的数据。
RAID 4 结合了三块过更多的磁盘,其中一块磁盘专门用作奇偶校验。任何一块磁盘损坏时,整个逻辑设备保持完好,但性能下降。由于性能的缘故,这种配置并不常用。
RAID 5 结合了三块过更多的磁盘,并将奇偶校验分布在所有的磁盘上。原理和RAID4相似但性能明显更好。
在http://www.osfaq.com/vol1/linux_softraid.htm 能够找到更多的有关信息。
RedHat Linux 7.2 在系统初始安装过程中具备了轻而易举地创建软件级RAID的功能。这个过程的描述可以在http://www.redhat.com/docs/manuals/linux/RHL-7.2-Manual/custom-guide/software-raid.html 找到。简而言之,在安装过程中的“硬盘分区”部分:
(1) 创建“software RAID”(软件级别的RAID)分区。 你不能为每一个“RAID类型”的分区指定一个mount point。但你可以给出每个分区的大小,使它“能够扩展”或者使它成为主分区。 (2) 按“Make RAID”(创建RAID)按钮 (3) 在出现的对话框中输入:这个RAID阵列的mount point、分区类型、RIAD类型(RAID0、RAID1和RAID5中之一)、RAID成员分区(你在第一步中创建的)及备用分区数(RAID1和RAID5需要)。(当软RAID出现磁盘损坏时,备用分区将自动被使用)在第一步中,你应该???? (4) 按“OK”按钮,检查“Drive Summary”(磁盘信息)是否你的RAID阵列显示正确。
注:如果你在为/boot创建RAID分区,必须选择RAID 1而且必须使用最初的两块硬盘之一(IDE优先,SCSI次之)。如果你不是为/boot创建RAID分区,而是创建根 RAID 分区,这个分区必须是RAID 1而且必须是最初的两块硬盘之一(IDE优先,SCSI次之)。
使用shapecfg调整网络流量
在http://oreilly.linux.com/pub/a/linux/2000/08/24/LinuxAdmin.html能找到很有用的信息。尽管看起来我永远不需要在家里调整网络流量,但shapecfg仍然是一个有趣的练习。
参看附页:如何升级系统内核
|
Linux一些高级应用
浙公网安备 33010602011771号