﻿<?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-Share JAVA-随笔分类-Linux</title><link>http://www.blogjava.net/bcims/category/7097.html</link><description>&lt;font color="red"&gt;&lt;b&gt;什么样的素质决定什么样的技术&lt;/b&gt;&lt;/font&gt; 

&lt;div style="font-size:12px;cursor:pointer"&gt; &lt;span  title="www"&gt; www.WoMenSou.com &lt;我们搜&gt;&lt;/span&gt;&lt;/div</description><language>zh-cn</language><lastBuildDate>Sat, 05 Apr 2008 07:08:07 GMT</lastBuildDate><pubDate>Sat, 05 Apr 2008 07:08:07 GMT</pubDate><ttl>60</ttl><item><title>redhat linux 9 下载</title><link>http://www.blogjava.net/bcims/archive/2008/04/05/190916.html</link><dc:creator>EricWong</dc:creator><author>EricWong</author><pubDate>Sat, 05 Apr 2008 07:02:00 GMT</pubDate><guid>http://www.blogjava.net/bcims/archive/2008/04/05/190916.html</guid><wfw:comment>http://www.blogjava.net/bcims/comments/190916.html</wfw:comment><comments>http://www.blogjava.net/bcims/archive/2008/04/05/190916.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/bcims/comments/commentRss/190916.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/bcims/services/trackbacks/190916.html</trackback:ping><description><![CDATA[找了好久，先把它download了再说，留着以后有用。<br />提供个地址给大家：<br /><a href="http://ftp.ccc.uba.ar/download/pub/linux/redhat/redhat-9-en/iso/i386/shrike-i386-disc1.iso" target="_blank">http://ftp.ccc.uba.ar/download/pub/linux/redhat/redhat-9-en/iso/i386/shrike-i386-disc1.iso</a><br /><a href="http://ftp.ccc.uba.ar/download/pub/linux/redhat/redhat-9-en/iso/i386/shrike-i386-disc2.iso" target="_blank">http://ftp.ccc.uba.ar/download/pub/linux/redhat/redhat-9-en/iso/i386/shrike-i386-disc2.iso</a><br /><a href="http://ftp.ccc.uba.ar/download/pub/linux/redhat/redhat-9-en/iso/i386/shrike-i386-disc3.iso" target="_blank">http://ftp.ccc.uba.ar/download/pub/linux/redhat/redhat-9-en/iso/i386/shrike-i386-disc3.iso</a><br />源代码盘找不到了，这三个是安装盘。 <br />但Redhat Linux9不支持SATA。<img src ="http://www.blogjava.net/bcims/aggbug/190916.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/bcims/" target="_blank">EricWong</a> 2008-04-05 15:02 <a href="http://www.blogjava.net/bcims/archive/2008/04/05/190916.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>shell - bash简介</title><link>http://www.blogjava.net/bcims/archive/2006/01/17/28350.html</link><dc:creator>EricWong</dc:creator><author>EricWong</author><pubDate>Tue, 17 Jan 2006 12:00:00 GMT</pubDate><guid>http://www.blogjava.net/bcims/archive/2006/01/17/28350.html</guid><wfw:comment>http://www.blogjava.net/bcims/comments/28350.html</wfw:comment><comments>http://www.blogjava.net/bcims/archive/2006/01/17/28350.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/bcims/comments/commentRss/28350.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/bcims/services/trackbacks/28350.html</trackback:ping><description><![CDATA[<BR><BR><SPAN id=uline style="LINE-HEIGHT: 180%">bash简介</FONT></B></FONT><BR><FONT class=smallfont color=#ff9900>2004-04-23 15:18 pm</FONT><BR><FONT 作者：作者<br>来自：Linux文档<BR>现载：Www.8s8s.coM<BR>地址：无名<BR><BR>　　bash(Bourne Again Shell) 是 Red Hat 的缺省 shell. 它有40个内建命令和12个命令行参数。<BR>　　shell 是一个命令语言解释器（command-language interpreter）。 shell是用户和linux内核之间的接口程序。你在提示符下输入的每个命令都由shell先解释然后传给Linux内核。<BR>　　shell 如何启动 shell在你成功地登录进入系统后启动，并始终作为你与系统内核的交互手段直至你退出系统。你系统上的每位用户都有一个缺省的shell。每个用户的缺省shell在系统里的passwd文件里被指定，该文件的路径是/etc/passwd。<BR><BR>　　bash 命令概要<BR><BR>　　这是几个最常用的bash内部命令：<BR>alias: 设置bash别名。<BR>bg: 使一个被挂起的进程在后台继续执行。<BR>cd: 改变当前工作目录。<BR>exit: 终止shell。<BR>export: 使变量的值对当前shell的所有子进程都可见 。<BR>fc: 用来编辑历史命令列表里的命令。<BR>fg: 使一个被挂起的进程在前台继续执行。<BR>help: 显示bash内部命令的帮助信息。<BR>kill: 终止某个进程。<BR>pwd: 显示当前工作目录。<BR>unalias: 删除已定义的别名。<BR><BR>bash 还有许多命令，但这些是最常用的，想了解更详细的情况，请参考bash的手册--在提示符下键入 man bash。<BR><BR>bash 变量<BR><BR>这里是几个最有用的bash变量，包括变量名和简单描述。<BR>EDITOR, FCEDIT: bsah fc 命令的缺省编辑器。<BR>HISTFILE: 用于贮存历史命令的文件。<BR>HISTSIZE: 历史命令列表的大小。<BR>HOME: 当前用户的用户目录。<BR>OLDPWD: 前一个工作目录。<BR>PATH: bash寻找可执行文件的搜索路径。<BR>PS1: 命令行的一级提示符。<BR>PS2: 命令行的二级提示符。<BR>PWD: 当前工作目录。<BR>SECONDS: 当前shell开始后所流逝的秒数。<BR><BR>bash的特性：<BR><BR>1.命令补齐（Command-Line Completion）<BR>在 bash 下输入命令时你不必把命令输全 shell 就能判断出你所要输入的命令。只要输入命令的一部分，再按下 Tab 键，当你这样做以后，bash 将帮你补齐命令并显示在屏幕上。但在你按下回车键以前命令并没有被执行，bash 会让你检验补齐的命令是否是你真正需要的。在输入象这样短的命令时你也许看不出它的价值所在，甚至在命令很短时还会简慢输入的速度，但是当你要输入的命令有点长时，你会发现这个特性是多么的美好。<BR><BR>2. 通配符 <BR>另一个使命令输入变得更简单的方法是在命令中使用通配符。bash 支持三种通配符：<BR><BR>* 匹配任何字符和任何数目的字符<BR>? 匹配任何单字符<BR>[...] 匹配任何包含在括号里的单字符<BR><BR>3. 命令历史记录 <BR>bash 支持命令历史记录。这意味着 bash 保留了一定数目的你先前已经在shell 里输入过的命令。这个数目取决于一个叫做HISTSIZE的变量。有关 HISTSIZE 的更多信息，请看本文后面的“bash 变量”一节。<BR><BR>bash 把你先前输入的命令文本保存在一个历史列表中。当你用你的帐号登录后历史列表将根据一个历史文件被初始化。历史文件的文件名被一个叫 HISTFILE 的 bash变量指定。历史文件的缺省名字是 .bash_history。这个文件通常在你的用户目录中。（注意该文件的文件名以一个句号开头，这意味着它是隐含的，仅当你带 -a 或 -A参数的 ls 命令列目录时才可见）<BR><BR>使用历史记录列表最简单的方法是用上方向键。按下上方向键后最后键入的命令将出现在命令行上。再按一下则倒数第二条命令会出现，以此类推。如果上翻多了的话也可以用向下的方向键来下翻。显示在命令行上的历史命令可以被编辑。<BR><BR>另一个使用命令历史文件的方法是用 bash 的内部命令 history 和 fc(fix 命令)命令来显示和编辑历史命令。history 命令能以两种不同的方法来调用。第一种是：<BR><BR>history [n]<BR><BR>当 history 命令没有参数时，整个历史命令列表的内容将被显示出来。下面是一个命令历史列表的例子：<BR><BR>使用 n 参数的作用是仅有最后 n 个历史命令会被列出。例如，history 5 显示最后 5 个命令。<BR>调用 history 命令的第二种方法用于修改命令历史列表文件的内容。命令的语法如下：<BR><BR>history [-r|w|a|n] [filename]<BR><BR>这种形式中，-r 选项告诉 history 命令读命令历史列表文件的内容并且把它们当作当前的命令历史列表。-w 选项将把当前的命令历史记录写入文件中并覆盖文件原来的内容。-a 选项把当前的命令历史记录追加到文件中。-n 选项将读取文件中的内容并加入到当前历史命令列表中。如果 filename 选项没有被指定，history 命令将用变量HISTFILE 的值来代替。<BR><BR>fc 命令能用两种方法来编辑历史命令。第一种使用下列语法：<BR><BR>fc [-e editor_name] [-n] [-l] [-r] [first] [last]<BR><BR>这里所有参数都是可选的。-e editor_name 选项用来指定用于编辑命令的文本编辑器。 first 和 last 选项用于选择列出历史命令的范围，既可以是数字也可以是字符串。-n 选项禁止列出命令的编号。-r 选项反向列出匹配的命令。-l 选项把匹配的命令行列在屏幕上（而不是在编辑器中）。如果-e editor_name参数没有被指定，则以变量FCEDIT的值来代替，如果该变量不存在的话，则用变量EDITOR的值来代替，都不存在的话将使用vi编辑器。<BR><BR><BR>4.别名 <BR>命令别名通常是其他命令的缩写，用来减少键盘输入。<BR><BR>alias file='ls -l | grep ^-'<BR><BR>alias ls='ls --color'<BR><BR>alias sub='ls -F -l | grep /$'<BR><BR>这是一些很多用户认为有用的别名，你可以把它们写入你的.profile文件中提高工作效 ：<BR><BR>如果想取消别名，可以使用下面的命令：<BR><BR>unalias &lt;alias name&gt;<BR><BR><BR>定义别名时，等号的两头不能有空格，否则 shell 不能决定你需要做什么。<BR><BR>5.输入重定向 <BR><BR>输入重定向用于改变一个命令的输入源。一些命令需要在命令行里输入足够的信息才能工作。 输入重定向并不经常使用因为大多数命令都以参数的形式在命令行上指定输入文件的文件名。尽管如此，当你使用一个不接受文件名为输入参数的命令，而需要的输入又是在一个已存在的文件里时，你就能用输入重定向解决问题。<BR><BR>6.输出重定向 <BR><BR>输出重定向比输入重定向更常用。输出重定向使你能把一个命令的输出重定向到一个文件里，而不是显示在屏幕上。<BR><BR>7.管道 <BR><BR>管道可以把一系列命令连接起来。这意味着第一个命令的输出会通过管道传给第二个命令而作为第二个命令的输入，第二个命令的输出又会作为第三个命令的输入 ，以此类推。而管道行中最后一个命令的输出才会显示在屏幕上（如果命令行里使用了输出重定向的话，将会放进一个文件里）。<BR><BR>8.提示符 <BR><BR>bash 有两级用户提示符。第一级是你经常看到的 bash 在等待命令输入时的提示符。缺省的一级提示符是字符$（如果是超级用户，则是#号）。你可以通过改变bash 的PS1变量的值来改变你的缺省提示符。<BR><BR>把bash shell 的提示符该为指定的字符串。<BR><BR>当bash 期待输入更多的信息以完成命令时显示第二级提示符。缺省的第二级提示符是 &gt;。 果你要改变第二级提示符，可以通过设置PS2变量的值来实现。<BR><BR>另外你还可以用特殊的字符来定义你的提示符，下面的列表列出了最常用的特殊字符。 <BR><BR>字符 <BR>含义<BR><BR>!<BR>显示该命令的历史记录编号。<BR># 显示当前命令的命令编号。<BR>$ 显示$符作为提示符，如果用户是root的话，则显示#号。<BR>显示反斜杠。<BR>d 显示当前日期。<BR>h 显示主机名。<BR>打印新行。<BR>nn 显示nnn的八进制值。<BR>s 显示当前运行的shell的名字。<BR>显示当前时间。<BR>u 显示当前用户的用户名。<BR>W 显示当前工作目录的名字。<BR>w 显示当前工作目录的路径。<BR><BR><BR><BR>9. 作业控制（Job Control） <BR><BR>作业控制能够控制当前正在运行的进程的行为。特别地，你能把一个正在运行的进程挂起，稍后再恢复它的运行。bash 保持对所有已启动的进程的跟踪，你能在一个正在运行的进程的生命期内的任何时候把它挂起或是使它恢复运行。<BR><BR>按下 Ctrl-Z 使一个运行的进程挂起。bg 命令使一个被挂起的进程在后台恢复运行，反之 fg 命令使进程在前台恢复运行。这几个命令在当用户想在后台运行而意外的把它放到了前台时，经常被用到。当一个命令在前台被运行时，它会禁止用户与 shell 的交互，直到该命令结束。这通常不会造成麻烦，因为大多数命令很快就执行完了。如果你要运行的命令要花费很长的时间的话，我们通常会把它放到后台，以使我们能在前台继续输入其他命令。<BR><BR><BR>10. 用户化配置bash <BR><BR>为了保存这些用户化配置，必须把它们保存到一个bash的初始化文件里。 你能把任何想每次进入bash都执行的命令放到初始化文件里。这个文件里最常见到的命令通常是alias和变量的初始化。bash的初始化文件叫做 profile。每个使用bash的用户都有一个 .profile文件在他的用户目录里。bash在每次启动时都读取这个文件，并执行所有包含的命令。<BR><BR>下面的代码是缺省的.profile文件的内容。这个文件的位置在 /etc目录。如果你想设置自己的bash 的话把它拷到你的用户目录里（如果还没有的话）并命名为.profile。<BR><BR></FONT><BR><FONT < span></FONT></SPAN><img src ="http://www.blogjava.net/bcims/aggbug/28350.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/bcims/" target="_blank">EricWong</a> 2006-01-17 20:00 <a href="http://www.blogjava.net/bcims/archive/2006/01/17/28350.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Linux Shells简介 </title><link>http://www.blogjava.net/bcims/archive/2006/01/17/28351.html</link><dc:creator>EricWong</dc:creator><author>EricWong</author><pubDate>Tue, 17 Jan 2006 12:00:00 GMT</pubDate><guid>http://www.blogjava.net/bcims/archive/2006/01/17/28351.html</guid><wfw:comment>http://www.blogjava.net/bcims/comments/28351.html</wfw:comment><comments>http://www.blogjava.net/bcims/archive/2006/01/17/28351.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/bcims/comments/commentRss/28351.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/bcims/services/trackbacks/28351.html</trackback:ping><description><![CDATA[<SPAN id=uline style="LINE-HEIGHT: 180%"><BR><BR>什么是 Shell? <BR>Shell是一种具备特殊功能的程颍墙橛谑褂谜吆?UNIX/Linux 操作系统之核心程序（kernel）间的一个接口。为什么我们说 shell 是一种介于系统核心程序与使用者间的中介者呢？读过操作系统概论的读者们都知道操作系统是一个系统资源的管理者与分配者，当您有需求时，您得向系统提出；从操作系统的角度来看，它也必须防止使用者因为错误的操作而造成系统的伤害？众所周知，对计算机下命令得透过命令（command）或是程序（program）；程序有编译器（compiler）将程序转为二进制代码，可是命令呢？其实shell 也是一支程序，它由输入设备读取命令，再将其转为计算机可以了解的机械码，然后执行它。<BR>各种操作系统都有它自己的 shell，以 DOS 为例，它的 shell 就是 command.com 檔。如同 DOS 下有 NDOS，4DOS，DRDOS 等不同的命令解译程序可以取代标准的 command.com ，UNIX 下除了 Bourne shell（/bin/sh） 外还有 C shell（/bin/csh）、Korn shell（/bin/ksh）、Bourne again shell（/bin/bash）、Tenex C shell（tcsh） … 等其它的 shell。UNIX/Linux 将 shell 独立于核心程序之外，使得它就如同一般的应用程序，可以在不影响操作系统本身的情况下进行修改、更新版本或是添加新的功能。<BR>Shell 的激活<BR>在系统起动的时候，核心程序会被加载内存，负责管理系统的工作，直到系统关闭为止。它建立并控制着处理程序，管理内存、档案系统、通讯等等。而其它的程序，包括 shell 程序，都存放在磁盘中。核心程序将它们加载内存，执行它们，并且在它们中止后清理系统。Shell 是一个公用程序，它在您签入时起动。藉由解译使用者输入的命令（由命令列或命令档），Shell 提供使用者和核心程序产生交谈的功能。<BR>当您签入（login）时，一个交谈式的shell 会跟着起动，并提示您输入命令。在您键入一个命令后，接着就是 shell 的工作了，它会进行： <BR>1. 语法分析命令列<BR>2. 处理万用字符（wildcards）、转向（redirection）、管线（pipes）与工作控制（job control）<BR>3. 搜寻并执行命令<BR>当您刚开始学UNIX/Linux系统时，您大部份的时间会花在于提示符号（prompt）下执行命令。<BR>如果您经常会输入一组相同形式的命令，您可能会想要自动执行那些工作。如此，您可以将一些命令放入一个档案（称为命令档，script），然后执行该档。一个shell 命令档很像是 DOS 下的批次檔（如 Autoexec.bat）：它把一连串的 UNIX 命令存入一个档案，然后执行该档。较成熟的命令档还支持若干现代程序语言的控制结构，譬如说能做条件判断、循环、档案测试、传送参数等。要写着写命令档，不仅要学习程序设计的结构和技巧，而且对 UNIX/Linux 公用程序及如何运作需有深入的了解。有些公用程序的功能非常强大（例如 grep、sed 和awk），它们常被用于命令档来操控命令输出和档案。在您对那些工具和程序设计结构变得熟悉之后，您就可以开始写命令档。当由命令档执行命令时，此刻，您就已经把 shell 当做程序语言使用了。<BR>细说 Shell 的生平<BR>第一个有重要意义的，标准的 UNIX shell 是V7（AT&amp;T的第七版）UNIX，在1979 年底被提出，且以它的创造者 Stephen Bourne 来命名。Bourne shell 是以 Algol 这种语言为基础来设计，主要被用来做自动化系统管理工作。虽然 Bourne shell 以简单和速度而受欢迎，但它缺少许多交谈性使用的特色，例如历程、别名和工作控制。<BR>C shell 是在加州大学柏克来分校于70年代末期发展而成，而以2BSD UNIX的部分发行。这个 shell 主要是由 Bill Joy 写成，提供了一些在标准 Bourne shell 所看不到的额外特色。C shell 是以C 程序语言作为基础，且它被用来当程序语言时，能共享类似的语法。它也提供在交谈式运用上的改进，例如命令列历程、别名和工作控制。因为 C shell 是在大型机器上设计出来，且增加了一些额外功能，所以 C shell 有在小型机器上跑得较慢，即使在大型机器上跟 Bourne shell 比起来也显得缓慢。<BR>有了 Bourne shell 和 C shell 之后，UNIX 使用者就有了选择，且争论那一个 shell 较好。AT&amp;T 的David Korn 在 80 年代中期发明了 Korn shell，在 1986 年发行且在 1988 年成为正式的部分 SVR4 UNIX。Korn shell 实际上是 Bourne shell 的超集，且不只可在 UNIX 系统上执行，同时也可在 OS/2、VMS、和 DOS上执行。它提供了和 Bourne shell 向上兼容的能力，且增加了许多在 C shell 上受欢迎的特色，更增加了速度和效率。 Korn shell 已历经许多修正版，要找寻您使用的是那一个版本可在 ksh 提示符号下按 Ctrl-v 键。<BR>三种主要的 Shell 与其分身<BR>在大部份的UNIX系统，三种著名且广被支持的shell 是Bourne shell（AT&amp;T shell，在 Linux 下是BASH）、C shell（Berkeley shell，在 Linux 下是TCSH）和 Korn shell（Bourne shell的超集）。这三种 shell 在交谈（interactive）模式下的表现相当类似，但作为命令文件语言时，在语法和执行效率上就有些不同了。<BR>Bourne shell 是标准的 UNIX shell，以前常被用来做为管理系统之用。大部份的系统管理命令文件，例如 rc start、stop 与shutdown 都是Bourne shell 的命令档，且在单一使用者模式（single user mode）下以 root 签入时它常被系统管理者使用。Bourne shell 是由 AT&amp;T 发展的，以简洁、快速著名。 Bourne shell 提示符号的默认值是 $。<BR>C shell 是柏克莱大学（Berkeley）所开发的，且加入了一些新特性，如命令列历程（history）、别名（alias）、内建算术、档名完成（filename completion）、和工作控制（job control）。对于常在交谈模式下执行 shell 的使用者而言，他们较喜爱使用 C shell；但对于系统管理者而言，则较偏好以 Bourne shell 来做命令档，因为 Bourne shell 命令檔比 C shell 命令档来的简单及快速。C shell 提示符号的默认值是 %。<BR>Korn shell 是Bourne shell 的超集（superset），由 AT&amp;T 的 David Korn 所开发。它增加了一些特色，比 C shell 更为先进。Korn shell 的特色包括了可编辑的历程、别名、函式、正规表达式万用字符（regular expression wildcard）、内建算术、工作控制（job control）、共作处理（coprocessing）、和特殊的除错功能。Bourne shell 几乎和 Korn shell 完全向上兼容（upward compatible），所以在 Bourne shell 下开发的程序仍能在 Korn shell 上执行。Korn shell 提示符号的默认值也是 $。在 Linux 系统使用的 Korn shell 叫做 pdksh，它是指 Public Domain Korn Shell。<BR>除了执行效率稍差外，Korn shell 在许多方面都比 Bourne shell 为佳；但是，若将 Korn shell 与 C shell 相比就很困难，因为二者在许多方面都各有所长，就效率和容易使用上看，Korn shell 是优于 C shell，相信许多使用者对于 C Shell 的执行效率都有负面的印象。<BR>在shell 的语法方面，Korn shell 是比较接近一般程序语言，而且它具有子程序的功能及提供较多的资料型态。至于 Bourne shell，它所拥有的资料型态是三种 shell 中最少的，仅提供字符串变量和布尔型态。在整体考量下 Korn shell 是三者中表现最佳者，其次为 C shell，最后才是 Bourne shell，但是在实际使用中仍有其它应列入考虑的因素，如速度是最重要的选择时，很可能应该采用 Bourne shell，因它是最基本的 shell，执行的速度最快。<BR>tcsh 是近几年崛起的一个免费软件（Linux 下的C shell 其实就是使用 tcsh）执行，它虽然不是UNIX 的标准配备，但是从许多地方您都可以下载到它。如果您是 C shell 的拥护者，笔者建议不妨试试 tcsh，因为您至少可以将它当作是 C shell 来使用。如果您愿意花点时间学习，您还可以享受许多它新增的优越功能，例如： <BR>1. tcsh 提供了一个命令列（command line）编辑程序。 <BR>2. 提供了命令列补全功能。 <BR>3. 提供了拼字更正功能。它能够自动检测并且更正在命令列拼错的命令或是单字。 <BR>4. 危险命令侦测并提醒的功能，避免您一个不小心执行了rm* 这种杀伤力极大的命令。 <BR>5. 提供常用命令的快捷方式（shortcut）。 <BR>bash 对 Bourne shell 是向下兼容（backward compatible），并融入许多C shell 与Korn shell 的功能。这些功能其实 C shell（当然也包括了tcsh）都有，只是过去 Bourne shell 都未支持。以下笔者将介绍 bash 六点重要的改进（详细的使用说明笔者会在以后的章节介绍）： <BR>1. 工作控制（job contorl）。bash 支持了关于工作的讯号与指令，本章稍后会提及。<BR>2. 别名功能（aliases）。alias 命令是用来为一个命令建立另一个名称，它的运作就像一个宏，展开成为它所代表的命令。别名并不会替代掉命令的名称，它只是赋予那个命令另一个名字。<BR>3. 命令历程（command history）。BASH shell 加入了C shell 所提供的命令历程功能，它以 history 工具程序记录了最近您执行过的命令。命令是由 1 开始编号，默认值为500。history 工具程序是一种短期记忆，记录您最近所执行的命令。要看看这些命令，您可以在命令列键入 history，如此将会显示最近执行过之命令的清单，并在前方加上编号。<BR>这些命令在技术上每个都称为一个事件。事件描述的是一个已经采取的行动（已经被执行的命令）。事件是依照执行的顺序而编号，越近的事件其编号码越大，这些事件都是以它的编号或命令的开头字符来辨认的。history 工具程序让您参照一个先前发生过的事件，将它放在命令列上并允许您执行它。最简单的方法是用上下键一次放一个历程事件在您的命令列上；您并不需要先用 history 显示清单。按一次向上键会将最后一个历程事件放在您的命令列上，再按一次会放入下一个历程事件。按向下键则会将前一个事件放在命令列上。<BR>4. 命令列编辑程序。BASH shell 命令列编辑能力是内建的，让您轻松地在执行之前修改您输入的命令。若是您在输入命令时拼错了字，您不需重新输入整个命令，只需在执行命令之前使用编辑功能纠正错误即可。这尤其适合于使用冗长的路径名称当作参数的命令时。命令列编辑作业是 Emacs 编辑命令的一部份。您可以用 Ctrl-F 或向右键往前移一个字符，Ctrl-b 或向左键往回移一个字符。Ctrl-d 或DEL 键会删除光标目前所在处的字符。要增加文字的话，您只需要将光标移到您要插入文字的地方并键入新字符即可。无论何时，您都可以按 ENTER 键执行命令。<BR>5. 允许使用者自订按键。<BR>6. 提供更丰富的变量型态、命令与控制结构至 shell 中。<BR>　<BR>bash 与tcsh 一样可以从许多网站上免费下载，它们的性质也十分类似，都是整合其前一代的产品然后增添新的功能，这些新增的功能主要都着重在强化 shell 的程序设计能力以及让使用者能够自行定义自己偏好的作业环境。除了上述的五种 shell 之外，zsh 也是一个广为UNIX 程序设计人员与进阶使用者所采用的 shell，zsh 基本上也是 Bourne shell 功能的扩充。<BR>Shell 的使用<BR>不论是哪一种Shell，它最主要的功用都是解译使用者在命令列提示符号下输入的指令。Shell 语法分析命令列，把它分解成以空白区分开的符号（token），在此空白包括了跳位键（tab）、空白和换行（New Line）。如果这些字包含了metacharacter，shell 将会评估（evaluate）它们的正确用法。另外，shell 还管理档案输入输出及幕后处理（background processing）。在处理命令列之后，shell 会寻找命令并开始执行它们。<BR>Shell 的另一个重要功用是提供个人化的使用者环境，这通常在 shell 的初始化档案中完成（.profile、.login、.cshrc、.tcshrc 等等）。这些档案包括了设定终端机键盘和定义窗口的特征；设定变量，定义搜寻路径、权限限、提示符号和终端机类形；以及设定特殊应用程序所需要的变量，例如窗口、文字处理程序、及程序语言的链接库。Korn shell 和 C shell 加强了个别化的能力:增加历程、别名、和内建变量集以避免使用者误杀档案、不慎签出、并在当工作完成时通知使用者。<BR>Shell 也能当解译性的程序语言（interpreted programing language）。Shell 程序，通常叫做命令文件，它由列在档案内的命令所构成。此程序在编辑器中编辑（虽然也可以直接在命令列下写作程序, online scripting），由 UNIX 命令和基本的程序结构，例如变量的指定、测试条件、和循环所构成。您不需要编译 shell 命令檔。Shell 本身会解译命令档中的每一行，就如同由键盘输入一样。shell 负责解译命令，而使用者则必须了解这些命令能做什么。这本书的索引列出了一些有用的命令和它们的使用方法。<BR>Shell 的功用<BR>为了确保任何提示符号下输入的命令都能够适当地执行。shell 担任的工作包括有： <BR>1. 读取输入和语法分析命令列 <BR>2. 对特殊字符求值 <BR>3. 设立管线、转向、和幕后处理 <BR>4. 处理讯号 <BR>5. 设立程序来执行 <BR></SPAN><img src ="http://www.blogjava.net/bcims/aggbug/28351.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/bcims/" target="_blank">EricWong</a> 2006-01-17 20:00 <a href="http://www.blogjava.net/bcims/archive/2006/01/17/28351.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>shell - cut的用法 </title><link>http://www.blogjava.net/bcims/archive/2006/01/17/28349.html</link><dc:creator>EricWong</dc:creator><author>EricWong</author><pubDate>Tue, 17 Jan 2006 11:59:00 GMT</pubDate><guid>http://www.blogjava.net/bcims/archive/2006/01/17/28349.html</guid><wfw:comment>http://www.blogjava.net/bcims/comments/28349.html</wfw:comment><comments>http://www.blogjava.net/bcims/archive/2006/01/17/28349.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/bcims/comments/commentRss/28349.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/bcims/services/trackbacks/28349.html</trackback:ping><description><![CDATA[<BR><BR>来自：Linux文档<BR>现载：Www.8s8s.coM<BR>地址：无名<BR><BR>我们经常会遇到需要取出分字段的文件的某些特定字段，例如 /etc/password就是通过":"分隔各个字段的。可以通过cut命令来实现。例如，我们希望将系统账号名保存到特定的文件，就可以：<BR>cut -d: -f 1 /etc/passwd &gt; /tmp/users<BR>-d用来定义分隔符，默认为tab键，-f表示需要取得哪个字段<BR><BR>当然也可以通过cut取得文件中每行中特定的几个字符，例如：<BR>cut -c3-5 /etc/passwd<BR>就是输出/etc/passwd文件中每行的第三到第五个字符。<BR>-c 和 －f 参数可以跟以下子参数：<BR>N 第N个字符或字段<BR>N- 从第一个字符或字段到文件结束<BR>N-M 从第N个到第M个字符或字段<BR>-M 从第一个到第N个字符或字段<BR><BR><img src ="http://www.blogjava.net/bcims/aggbug/28349.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/bcims/" target="_blank">EricWong</a> 2006-01-17 19:59 <a href="http://www.blogjava.net/bcims/archive/2006/01/17/28349.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>深入分析Windows和Linux动态库应用异同 </title><link>http://www.blogjava.net/bcims/archive/2006/01/17/28342.html</link><dc:creator>EricWong</dc:creator><author>EricWong</author><pubDate>Tue, 17 Jan 2006 11:54:00 GMT</pubDate><guid>http://www.blogjava.net/bcims/archive/2006/01/17/28342.html</guid><wfw:comment>http://www.blogjava.net/bcims/comments/28342.html</wfw:comment><comments>http://www.blogjava.net/bcims/archive/2006/01/17/28342.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/bcims/comments/commentRss/28342.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/bcims/services/trackbacks/28342.html</trackback:ping><description><![CDATA[<BR><BR>
<DIV class=postText>
<P>深入分析Windows和Linux动态库应用异同</P>
<P>作者：刘世栋 杨林</P>
<P>摘要：动态链接库技术实现和设计程序常用的技术，在Windows和Linux系统中都有动态库的概念，采用动态库可以有效的减少程序大小，节省空间，提高效率，增加程序的可扩展性，便于模块化管理。</P>
<P>但不同操作系统的动态库由于格式 不同，在需要不同操作系统调用时需要进行动态库程序移植。本文分析和比较了两种操作系统动态库技术，并给出了将Visual C++编制的动态库移植到Linux上的方法和经验。</P>
<P>1、引言</P>
<P>动态库（Dynamic Link Library abbr，DLL）技术是程序设计中经常采用的技术。其目的减少程序的大小，节省空间，提高效率，具有很高的灵活性。</P>
<P>采用动态库技术对于升级软件版本更加容易。与静态库（Static Link Library）不同，动态库里面的函数不是执行程序本身的一部分，而是根据执行需要按需载入，其执行代码可以同时在多个程序中共享。</P>
<P>在Windows和Linux操作系统中，都可采用这种方式进行软件设计，但他们的调用方式以及程序编制方式不尽相同。本文首先分析了在这两种操作系统中通常采用的动态库调用方法以及程序编制方式，然后分析比较了这两种方式的不同之处，最后根据实际移植程序经验，介绍了将VC++编制的Windows动态库移植到Linux下的方法。</P>
<P>2、动态库技术</P>
<P>2.1 Windows动态库技术</P>
<P>动态链接库是实现Windows应用程序共享资源、节省内存空间、提高使用效率的一个重要技术手段。常见的动态库包含外部函数和资源，也有一些动态库只包含资源，如Windows字体资源文件，称之为资源动态链接库。通常动态库以.dll，.drv、.fon等作为后缀。</P>
<P>相应的windows静态库通常以.lib结尾，Windows自己就将一些主要的系统功能以动态库模块的形式实现。</P>
<P>Windows动态库在运行时被系统加载到进程的虚拟空间中，使用从调用进程的虚拟地址空间分配的内存，成为调用进程的一部分。DLL也只能被该进程的线程所访问。DLL的句柄可以被调用进程使用；调用进程的句柄可以被DLL使用。</P>
<P>DLL模块中包含各种导出函数，用于向外界提供服务。DLL可以有自己的数据段，但没有自己的堆栈，使用与调用它的应用程序相同的堆栈模式；一个DLL在内存中只有一个实例；DLL实现了代码封装性；DLL的编制与具体的编程语言及编译器无关，可以通过DLL来实现混合语言编程。DLL函数中的代码所创建的任何对象（包括变量）都归调用它的线程或进程所有。</P>
<P>根据调用方式的不同，对动态库的调用可分为静态调用方式和动态调用方式。</P>
<P>(1)静态调用，也称为隐式调用，由编译系统完成对DLL的加载和应用程序结束时DLL卸载的编码（Windows系统负责对DLL调用次数的计数），调用方式简单，能够满足通常的要求。通常采用的调用方式是把产生动态连接库时产生的.LIB文件加入到应用程序的工程中，想使用DLL中的函数时，只须在源文件中声明一下。</P>
<P>LIB文件包含了每一个DLL导出函数的符号名和可选择的标识号以及DLL文件名，不含有实际的代码。Lib文件包含的信息进入到生成的应用程序中，被调用的DLL文件会在应用程序加载时同时加载在到内存中。</P>
<P>(2)动态调用，即显式调用方式，是由编程者用API函数加载和卸载DLL来达到调用DLL的目的，比较复杂，但能更加有效地使用内存，是编制大型应用程序时的重要方式。在Windows系统中，与动态库调用有关的函数包括：</P>
<P>①LoadLibrary（或MFC 的AfxLoadLibrary），装载动态库。</P>
<P>②GetProcAddress，获取要引入的函数，将符号名或标识号转换为DLL内部地址。</P>
<P>③FreeLibrary（或MFC的AfxFreeLibrary），释放动态链接库。</P>
<P>在windows中创建动态库也非常方便和简单。在Visual C++中，可以创建不用MFC而直接用C语言写的DLL程序，也可以创建基于MFC类库的DLL程序。每一个DLL必须有一个入口点，在VC++中，DllMain是一个缺省的入口函数。DllMain负责初始化(Initialization)和结束(Termination)工作。</P>
<P>动态库输出函数也有两种约定，分别是基于调用约定和名字修饰约定。DLL程序定义的函数分为内部函数和导出函数，动态库导出的函数供其它程序模块调用。通常可以有下面几种方法导出函数：</P>
<P>①采用模块定义文件的EXPORT部分指定要输入的函数或者变量。</P>
<P>②使用MFC提供的修饰符号_declspec(dllexport)。</P>
<P>③以命令行方式，采用/EXPORT命令行输出有关函数。</P>
<P>在windows动态库中，有时需要编写模块定义文件(.DEF)，它是用于描述DLL属性的模块语句组成的文本文件。</P>
<P>2.2 Linux共享对象技术</P>
<P>在Linux操作系统中，采用了很多共享对象技术（Shared Object），虽然它和Windows里的动态库相对应，但它并不称为动态库。相应的共享对象文件以.so作为后缀，为了方便，在本文中，对该概念不进行专门区分。Linux系统的/lib以及标准图形界面的/usr/X11R6/lib等目录里面，就有许多以so结尾的共享对象。</P>
<P>同样，在Linux下，也有静态函数库这种调用方式，相应的后缀以.a结束。Linux采用该共享对象技术以方便程序间共享，节省程序占有空间，增加程序的可扩展性和灵活性。Linux还可以通过LD-PRELOAD变量让开发人员可以使用自己的程序库中的模块来替换系统模块。</P>
<P>同Windows系统一样，在Linux中创建和使用动态库是比较容易的事情，在编译函数库源程序时加上-shared选项即可，这样所生成的执行程序就是动态链接库。通常这样的程序以so为后缀，在Linux动态库程序设计过程中，通常流程是编写用户的接口文件，通常是.h文件，编写实际的函数文件，以.c或.cpp为后缀，再编写makefile文件。对于较小的动态库程序可以不用如此，但这样设计使程序更加合理。</P>
<P>编译生成动态连接库后，进而可以在程序中进行调用。在Linux中，可以采用多种调用方式，同Windows的系统目录(..\system32等)一样，可以将动态库文件拷贝到/lib目录或者在/lib目录里面建立符号连接，以便所有用户使用。</P>
<P>下面介绍Linux调用动态库经常使用的函数，但在使用动态库时，源程序必须包含dlfcn.h头文件，该文件定义调用动态链接库的函数的原型。</P>
<P>(1)_打开动态链接库：dlopen，函数原型void *dlopen (const char *filename, int flag); dlopen用于打开指定名字(filename)的动态链接库，并返回操作句柄。</P>
<P>(2)取函数执行地址：dlsym，函数原型为: void *dlsym(void *handle, char *symbol); dlsym根据动态链接库操作句柄(handle)与符号(symbol)，返回符号对应的函数的执行代码地址。</P>
<P>(3)关闭动态链接库：dlclose，函数原型为: int dlclose (void *handle); dlclose用于关闭指定句柄的动态链接库，只有当此动态链接库的使用计数为0时,才会真正被系统卸载。</P>
<P>(4)动态库错误函数：dlerror，函数原型为: const char *dlerror(void); 当动态链接库操作函数执行失败时，dlerror可以返回出错信息，返回值为NULL时表示操作函数执行成功。</P>
<P>在取到函数执行地址后，就可以在动态库的使用程序里面根据动态库提供的函数接口声明调用动态库里面的函数。在编写调用动态库的程序的makefile文件时，需要加入编译选项-rdynamic和-ldl。</P>
<P>除了采用这种方式编写和调用动态库之外，Linux操作系统也提供了一种更为方便的动态库调用方式，也方便了其它程序调用，这种方式与Windows系统的隐式链接类似。其动态库命名方式为“lib*.so.*”。在这个命名方式中，第一个*表示动态链接库的库名，第二个*通常表示该动态库的版本号，也可以没有版本号。</P>
<P>在这种调用方式中，需要维护动态链接库的配置文件/etc/ld.so.conf来让动态链接库为系统所使用，通常将动态链接库所在目录名追加到动态链接库配置文件中。如具有X window窗口系统发行版该文件中都具有/usr/X11R6/lib，它指向X window窗口系统的动态链接库所在目录。</P>
<P>为了使动态链接库能为系统所共享，还需运行动态链接库的管理命令./sbin/ldconfig。在编译所引用的动态库时，可以在gcc采用 –l或-L选项或直接引用所需的动态链接库方式进行编译。在Linux里面，可以采用ldd命令来检查程序依赖共享库。</P>
<P>3、两种系统动态库比较分析</P>
<P>Windows和Linux采用动态链接库技术目的是基本一致的，但由于操作系统的不同，他们在许多方面还是不尽相同，下面从以下几个方面进行阐述。</P>
<P>(1)动态库程序编写，在Windows系统下的执行文件格式是PE格式，动态库需要一个DllMain函数作为初始化的人口，通常在导出函数的声明时需要有_declspec(dllexport)关键字。Linux下的gcc编译的执行文件默认是ELF格式，不需要初始化入口，亦不需要到函数做特别声明，编写比较方便。</P>
<P>(2)动态库编译，在windows系统下面，有方便的调试编译环境，通常不用自己去编写makefile文件，但在linux下面，需要自己动手去编写makefile文件，因此，必须掌握一定的makefile编写技巧，另外，通常Linux编译规则相对严格。</P>
<P>(3)动态库调用方面，Windows和Linux对其下编制的动态库都可以采用显式调用或隐式调用，但具体的调用方式也不尽相同。</P>
<P>(4)动态库输出函数查看，在Windows中，有许多工具和软件可以进行查看DLL中所输出的函数，例如命令行方式的dumpbin以及VC++工具中的DEPENDS程序。在Linux系统中通常采用nm来查看输出函数，也可以使用ldd查看程序隐式链接的共享对象文件。</P>
<P>(5)对操作系统的依赖，这两种动态库运行依赖于各自的操作系统，不能跨平台使用。因此，对于实现相同功能的动态库，必须为两种不同的操作系统提供不同的动态库版本。</P>
<P>4、动态库移植方法</P>
<P>如果要编制在两个系统中都能使用的动态链接库，通常会先选择在Windows的VC++提供的调试环境中完成初始的开发，毕竟VC++提供的图形化编辑和调试界面比vi和gcc方便许多。完成测试之后，再进行动态库的程序移植。</P>
<P>通常gcc默认的编译规则比VC++默认的编译规则严格，即使在VC++下面没有任何警告错误的程序在gcc调试中也会出现许多警告错误，可以在gcc中采用-w选项关闭警告错误。</P>
<P>下面给出程序移植需要遵循的规则以及经验。</P>
<P>(1)尽量不要改变原有动态库头文件的顺序。通常在C/C++语言中，头文件的顺序有相当的关系。另外虽然C/C++语言区分大小写，但在包含头文件时，Linux必须与头文件的大小写相同，因为ext2文件系统对文件名是大小写敏感，否则不能正确编译，而在Windows下面，头文件大小写可以正确编译。</P>
<P>(2)不同系统独有的头文件。在Windows系统中，通常会包括windows.h头文件，如果调用底层的通信函数，则会包含winsock..h头文件。因此在移植到Linux系统时，要注释掉这些Windows系统独有的头文件以及一些windows系统的常量定义说明，增加Linux都底层通信的支持的头文件等。</P>
<P>(3)数据类型。VC++具有许多独有的数据类型，如__int16，__int32，TRUE，SOCKET等，gcc编译器不支持它们。通常做法是需要将windows.h和basetypes.h中对这些数据进行定义的语句复制到一个头文件中，再在Linux中包含这个头文件。例如将套接字的类型为SOCKET改为int。</P>
<P>(4)关键字。VC++中具有许多标准C中所没有采用的关键字，如BOOL，BYTE，DWORD，__asm等，通常在为了移植方便，尽量不使用它们，如果实在无法避免可以采用#ifdef 和#endif为LINUX和WINDOWS编写两个版本。</P>
<P>(5)函数原型的修改。通常如果采用标准的C/C++语言编写的动态库，基本上不用再重新编写函数，但对于系统调用函数，由于两种系统的区别，需要改变函数的调用方式等，如在Linux编制的网络通信动态库中，用close()函数代替windows操作系统下的closesocket()函数来关闭套接字。另外在Linux下没有文件句柄，要打开文件可用open和fopen函数，具体这两个函数的用法可参考文献[2]。</P>
<P>(6)makefile的编写。在windows下面通常由VC++编译器来负责调试，但gcc需要自己动手编写makefile文件，也可以参照VC++生成的makefile文件。对于动态库移植，编译动态库时需要加入-shared选项。对于采用数学函数，如幂级数的程序，在调用动态库是，需要加入-lm。</P>
<P>(7)其它一些需要注意的地方</P>
<P>①程序设计结构分析，对于移植它人编写的动态库程序，程序结构分析是必不可少的步骤，通常在动态库程序中，不会包含界面等操作，所以相对容易一些。</P>
<P>②在Linux中，对文件或目录的权限分为拥有者、群组、其它。所以在存取文件时，要注意对文件是读还是写操作，如果是对文件进行写操作，要注意修改文件或目录的权限，否则无法对文件进行写。</P>
<P>③指针的使用，定义一个指针只给它分配四个字节的内存，如果要对指针所指向的变量赋值，必须用malloc函数为它分配内存或不把它定义为指针而定义为变量即可，这点在linux下面比windows编译严格。同样结构不能在函数中传值，如果要在函数中进行结构传值，必须把函数中的结构定义为结构指针。</P>
<P>④路径标识符，在Linux下是“/”，在Windows下是“\”，注意windows和Linux的对动态库搜索路径的不同。</P>
<P>⑤编程和调试技巧方面。对不同的调试环境有不同的调试技巧，在这里不多叙述。</P>
<P>5、结束语</P>
<P>本文系统分析了windows和Linux动态库实现和使用方式，从程序编写、编译、调用以及对操作系统依赖等方面综合分析比较了这两种调用方式的不同之处，根据实际程序移植经验，给出了将VC++编制的Windows动态库移植到Linux下的方法以及需要注意的问题，同时并给出了程序示例片断，实际在程序移植过程中，由于系统的设计等方面，可能移植起来需要注意的方面远比上面复杂，本文通过总结归纳进而为不同操作系统程序移植提供了有意的经验和技巧。<BR></P></DIV><img src ="http://www.blogjava.net/bcims/aggbug/28342.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/bcims/" target="_blank">EricWong</a> 2006-01-17 19:54 <a href="http://www.blogjava.net/bcims/archive/2006/01/17/28342.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>