Chinaunix首页 | 论坛 | 博客
  • 博客访问: 2473857
  • 博文数量: 867
  • 博客积分: 10010
  • 博客等级: 上将
  • 技术积分: 9800
  • 用 户 组: 普通用户
  • 注册时间: 2006-07-27 14:44
文章分类

全部博文(867)

文章存档

2007年(6)

2006年(861)

我的朋友

分类: LINUX

2006-08-18 23:12:42

使用如下每条命令检查您是否还有文件在您的home目录下:

$ ls

$ ls -a

$ ls ?al

为什么第一和第二条命令返回不同的文件数?

第三条命令返回的在您当前的home目录下最大的文件是多少?

您的home目录下有子目录吗?

4. 您现在使用touch为以后的步骤建立文件。这种扩展在接下来的命令中是如何工作

的在以后的章节中进行讨论。

为防止和其他用户发生冲突,请先在当前目录下新建一个属于您自己的工作目录,myname请用自己的用户名来替换。

$mkdir myname

现在,仅仅按照下面的行键入就行了(在集合与集合之间使用包括花括号{}和下划线的字符)

$ cd myname

$ touch {report,memo,graph}_{sep,oct,nov,dec}_{a,b,c}{1,2,3}

5. 使用命令ls检查最后一条命令的结果,你会发现它在您的home目录下生成了108个

新的空文件(您不必数)。这些文件代表了您将使用的在这个步骤中的代表的数据文件。如果您看不到这些文件,向教师寻找帮助,没有这些文件,该试验后面的步骤就无法进行。

6. 为了组织您的文件,您必须先建立一些新目录,使用mkdir在您的home目录中直接

建立一些子目录:

$ mkdir a_reports

$ mkdir september october november december

  再使用ls 检查您的工作。

7. 使用如下命令在您的一个新的目录中生成一些附加子目录

$ cd a_reports

为了切换到目录,接下来:

$ mkdir 1 2 3

使用ls检查你的子目录a_reports下的名为1,2,3的三个新的子目录。

8. 首先把所有带”b”的报告从home目录中移出并且按月份分组,先验证要使用的复杂的通配符模式,是个好方法。这样做以确保它对于正确的文件进行操作。如果你打算使用这种通配符模式,您可以使用一个无害的命令来替换您的命令。

$ cd

$ ls -l *dec?b?

你将看到列出了9个”december”,”b”文件,把其中的一个移到december目录中:

$ mv graph_dec_b1 december

用下面的语句移动其余的:

$ mv *dec?b? december

列出december目录的内容验证移动操作是否成功:

$ ls -l december

9.把其余所有带”b”的报告分别移动到各自对应的目录中:

$ mv *oct?b? october

$ mv *sep?b? september

__________________

希望能和你相互交流,愿意和您分享学习、进步中的每分喜悦与快乐

---------------------------------------------

http://tzhsuccess.itpub.net

向版主反映这个帖子 查看tzhsuccess 的IP地址

151楼 旧帖 06-07-17 23:41

[ 大 中 小 ] 给予该贴好评 编辑/删除 引用/回复

tzhsuccess

高级会员

注册日期: 2004 Apr

来自: 太?系-?子座

技术贴数:7934

论坛积分:31670

论坛排名:67

论坛徽章:23

会员2006贡献徽章 行业板块每日发贴之星 ERP板块每日发贴之星

10. 现在你将把”a”报告收集到它们各自对应的目录中。注意使用~代替 “你的home

目录”。通配符和模式的组合指定了您的home目录下所有以_a1结尾的文件。

$ cd a_reports

$ mv ~/*_a1 1/

“september””a1”文件陈旧并且不再需要,使用echo确定您已经建立了一个只匹配该类文件的模式,然后删除它们,并且检查剩下的”a1”文件是否正确移动:

$ cd 1

$ echo *sep*

$ rm *sep*

$ ls

graph_dec_a1 graph_oct_a1 memo_nov_a1 report_dec_a1 report_oct_a1 graph_nov_a1 memo_dec_a1 memo_oct_a1 report_nov_a1

11.最后移动”a2”和”a3”报告到各自对应的目录中。为了使过程变得有趣,我们将把

它们移出当前目录,使用相对和绝对的的路径名。第一步,使用pwd确定当前目录:

$ pwd

/home/student/a_reports/1

用echo检查涉及到”a2”文件的模式,然后使用绝对路径名:

$ echo /home/student/*a2*

$ mv /home/student/*a2* /home/student/a_reports/2

即使您当前在/home/student/a_reports/1目录下,也能把文件从/home/student移动到/home/student/a_reports/2目录中,因为您指定了文件的路径名称(在本例中为绝对路径名称)

现在使用相对路径移动“a3”文件。再一次的,首先确信模式指定的是正确的文件名称。

$ echo ../../*a3*

$ mv ../../*a3* ../3

12.返回您的home目录,并且使用ls 来校验仅存在该目录中的文件都是“c”文件(例如:graph_dec_c1,graph_dec_c2,…)

13.“c1”和“c2”报告文件对于每个月来说都非常重要,并且您打算把它们备份到另外一个目录:

$ mkdir /tmp/archive

$ cp report*[12] /tmp/archive/

另外的,所有的对于十二月份的报告文件应该备份到/tmp/archice目录下面。注意,-i选项使得cp程序在覆盖任何文件之前进行提示:

$ cp -i report_dec* /tmp/archive/

cp: overwrite `/tmp/archive/report_dec_c1'? n

cp: overwrite `/tmp/archive/report_dec_c2'? n

14.现在您备份了一些对您重要的“c”文件,您现在要删除位于您的home目录下面所有的文件。使用通配符“*c*”检查剩下的含有c的文件。您为什么不想执行命令rm *c* ?

(作为提示:尝试:ls *c*)

15.删除您的home目录下的剩余*c*文件。在发出一个破坏性的命令之前我们再次使用echo命令。

$ echo *c[1-3]

$ rm *c[1-3]

$ ls

a_reports   december november october september  

试验的结果

一个组织良好的home目录,文件放置在合理的位置,一些文件备份到了/tmp/archive目录中

----------------------------------------------------------

第二步:决定磁盘的使用率

场景/情节

您想记录您的系统中的每一个文件系统总共有多少剩余空间。

另外,您想有一个关于哪些目录消耗了系统的多数的空间的列表。

任务

1. 使用df获取文件系统总的剩余空间,您的输出应该是类似于下面的例子(尽管输出

依赖于您的特定的安装,输出可能不同)

$ df

Filesystem 1k-blocks Used Available Use% Mounted on

/dev/hdc2 14129568 1809728 11602096 14% /

/dev/hdc1 49743 8847 38328 19% /boot

none 63312 0 63312 0% /dev/shm

2.注意缺省的命令df操作是以块为单位报告信息,试用-h,-H选项,则是用 “用户可读的“形式报告

$ df -h

Filesystem Size Used Avail Use% Mounted on

/dev/hdc2 13G 1.8G 11G 14% /

/dev/hdc1 49M 8.7M 37M 19% /boot

none 62M 0 61M 0% /dev/shm

$ df -H

Filesystem Size Used Avail Use% Mounted on

/dev/hdc2 14G 1.9G 11G 14% /

/dev/hdc1 51M 9.1M 39M 19% /boot

none 65M 0 64M 0% /dev/shm

这两个开关有什么不同(使用man df)?

2. 在您的home目录使用du(磁盘使用率)命令来决定您所有的文件消耗的空间。确保尝试-h选项获得更可读的输出。

-------------------------------------------------------------

第三步:检视文本文件

任务

1.我们需要一个可供我们工作的文本文件:

$ cd

$ cp /usr/share/dict/words

.

2.使用cat显示文件:

$ cat words

Aarhus

Aaron

Ababa

…输出省略….

Zulu

Zulus

Zurich

3.在这种情况下cat是一个坏的选择,因为很多输出快速的滚屏,试用less:

$ less words

Aarhus

Aaron

Ababa

…输出省略…

abiding

Abidjan

Abigail

…输出省略…

使用less的时候,您可以向前翻页(使用b),向后翻页(使用空格键)在整个输出中,每次一屏.

4.如果你只需要快速的看看某个文件的最前几行和最后几行,你要使用head或者tail:

$ head words

Aarhus

Aaron

Ababa

aback

abaft

abandon

abandoned

abandoning

abandonment

abandons

$ tail words

zoologically

zoom

zooms

zoos

Zorn

Zoroaster

Zoroastrian

Zulu

Zulus

Zurich

您可以使用man帮助页面发现能使用head和tail中的哪个开关修改行号或是显示的行的相关的位置.

哪个命令你能使用显示文本的前50行?

哪个命令您能使用显示文件从第25,000行到结束的内容?

====================================================================

试验二

Linux文件系统的要点

估计时间:  90分钟

目标:          深入了解linux文件系统知识,包括:创建和使用links,使用slocate和find,归档压缩文件。

试验的起点:   一个Linux系统。

----------------------------------------------------------------

第一步:创建和使用links

任务:

1.在早些时候的试验,你已经拷贝了一个文件/usr/share/dict/words到你使用的用户lab的主目录 ~/words.在这个案例里,你不需要编辑文件-拷贝一个文件到你的主目录就可以在试验的期间使用了。

2.为了要避免原始文件和副本之间的混乱。在lab’s主目录中删除words的副本

$ cd

$ rm words

3.虽然你可能没有在那时了解它, 这个文件/usr/share/dict/words 的副本实际上是一个软link。列出内容下面目录 /usr/share/dict的内容查看link和它的参数。

$ ls ?l /usr/share/dict

total 404

-rw-r?r-- 1 root root 409305 Apr 3 10:29 linux.words

lrwxrwxrwx 1 root root 11 Apr 20 17:33 words ->linux.words

a.你能告诉我words是一个软链接吗?

b.为什么words的文件大小是11?

c.words允许所有人访问。这和linux.words文件用什么冲突?除了root用户,其他用户能够能在linux.words上面写数据吗?

4.再一次列出文件,这次显示相应的indeds号。为什么两个文件会有相同或不同的inodes号?

$ ls ?I /usr/share/dict

5. 现在在你的主目录中产生两个的代号和硬链接到/usr/share/dict/linux.words:

$ ln ?s /usr/share/dict/linux.words soft

$ ln /usr/share/dict/linux.words hard

6. 测试一下,你新建的链接两者都指到 linux.words 文件:

$ head hard soft

7. 检查你所有文件的link , 然后在下面回答问题:

$ ls ?il hard soft

$ stat had soft

报告文件大小,hard_______和soft_______.

被占用的真实的空间,hard_______和soft_______.

你怎样解释这两个link占用空间的差别。

列出链接的记数,hard_______和soft_______.

所有权,hard_______和soft_______.

文件硬链接的所有者和root用户可以完全访问,其他用户是只读权限。学生将会可以删除这个新的文件吗?为什么?

8. 更多的挑战:如果时间许可,探究一下下面的问题:

a.你能创建一个目标文件并不存在的软连接吗?看看ls命令的输出能否给你一些提示。

b.你能创建一个目标文件并不存在的软连接吗? 为什么?

c.你能创建一个软连接的硬连接吗? 当你尝试的时候有什么问题吗?

d.在创建了几个硬连接后,你能说出哪个是更加真实的文件吗?

----------------------------------------------------------------

步骤2:使用find命令

任务:

作为student登录。设计完成find命令提出结果

查看你当前的umask。设计并且运行find命令在每下列各项被描述的结果指令里。然后写下提供的空格里。

你可能需要在在find的man page里查许找。记得你能用/stringz man page里查找。

第一个答案已经为你列出。

1.在/var/lib目录下查找所有文件其所有者是games用户的文件

$ find /var/lib ?user games 2> /dev/null

2.在/var目录下查找所有文件其所有者是root用户的文件。_________________________________________________________

3.查找所有文件其所有者不是root,bin和student用户并用长格式显示(如ls ?l 的显示结果)。

_________________________________________________________

4.查找/usr/bin目录下所有大小超过一百万byte的文件并用长格式显示(如ls ?l 的显示结果)。

_________________________________________________________

5.对/etc/mail目录下的所有文件使用file命令.

_________________________________________________________

6.查找/tmp目录下属于student的所有普通文件,这些文件的修改时间为120分钟以前,查询结果用长格式显示(如ls ?l 的显示结果)。

_________________________________________________________

7. 对于查到的上述文件,用-ok选项删除。

_________________________________________________________

--------------------------------------------------------------------------

步骤3:归档和压缩

情景/故事:

你的系统上的主硬盘在你使用它的时候有可怕的噪音,但是它上面有有价值的数据。自从系统在两年半以前备份过,你有决定手动备份少数几个你最紧要的文件。那 / tmp 目录里储存在不同的硬盘的分区上快怀的分区,这样你想临时的把文件备份到那里。

任务:

1. 在/home目录里,用find命令定位文件所有者是student的文件。然后将其压缩。

$ find /home ?user student ?exec tar rvf /tmp/backup.tar {} \;

2. 保存/etc目录下的文件到/tmp目录下:

$ tar cvf /tmp/confbackup.tar /etc

3. 列出两个文件的大小

$ ls ?lh /tmp/*.tar

-rw-rw-r-- 1 student student 1.9M Oct 17 23:06 /tmp/backup.tar

-rw-rw-r-- 1 student student 5.4M Oct 18 00:27 /tmp/confbackup.tar

backup.tar文件的大小________

confbackup.tar文件的大小________

__________________

希望能和你相互交流,愿意和您分享学习、进步中的每分喜悦与快乐

---------------------------------------------

http://tzhsuccess.itpub.net

向版主反映这个帖子 查看tzhsuccess 的IP地址

152楼 旧帖 06-07-17 23:41

[ 大 中 小 ] 给予该贴好评 编辑/删除 引用/回复

tzhsuccess

高级会员

注册日期: 2004 Apr

来自: 太?系-?子座

技术贴数:7934

论坛积分:31670

论坛排名:67

论坛徽章:23

会员2006贡献徽章 行业板块每日发贴之星 ERP板块每日发贴之星

~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

第四讲小结

1. Ctrl-g 用于显示当前光标所在位置和文件状态信息。Shift-G 用于将光标跳

转至文件最后一行。先敲入一个行号然后按 Shift-G 则是将光标移动至该行

号代表的行。

2. 输入 / 然后紧随一个字符串是则是在当前所编辑的文档中向后查找该字符串。

输入问号 ? 然后紧随一个字符串是则是在当前所编辑的文档中向前查找该字

符串。完成一次查找之后按 n 键则是重复上一次的命令,可在同一方向上查

找下一个字符串所在;或者按 Shift-N 向相反方向查找下该字符串所在。

3. 如果光标当前位置是括号(、)、[、]、{、},按 % 可以将光标移动到配对的

括号上。

4. 在一行内替换头一个字符串 old 为新的字符串 new,请输入 :s/old/new

在一行内替换所有的字符串 old 为新的字符串 new,请输入 :s/old/new/g

在两行内替换所有的字符串 old 为新的字符串 new,请输入 :#,#s/old/new/g

在文件内替换所有的字符串 old 为新的字符串 new,请输入 :%s/old/new/g

进行全文替换时询问用户确认每个替换需添加 c 选项,请输入 :%s/old/new/gc

~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

第五讲第一节∶在 VIM 内执行外部命令的方法

** 输入 :! 然后紧随著输入一个外部命令可以执行该外部命令。**

1. 按下我们所熟悉的 : 命令设置光标到屏幕底部。这样就可以让您输入命令了。

2. 接著输入感叹号 ! 这个字符,这样就允许您执行外部的 shell 命令了。

3. 我们以 ls 命令为例。输入 !ls <回车> 。该命令就会列举出您当前目录的

内容,就如同您在命令行提示符下输入 ls 命令的结果一样。如果 !ls 没起

作用,您可以试试 :!dir 看看。

---> 提示∶ 所有的外部命令都可以以这种方式执行。

---> 提示∶ 所有的 : 命令都必须以 <回车> 告终。

~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

第五讲第二节∶关于保存文件的更多信息

** 要将对文件的改动保存到文件中,请输入 :w FILENAME 。**

1. 输入 :!dir 或者 :!ls 获知当前目录的内容。您应当已知道最后还得敲

<回车> 吧。

2. 选择一个尚未存在文件名,比如 TEST 。

3. 接著输入 :w TEST (此处 TEST 是您所选择的文件名。)

4. 该命令会以 TEST 为文件名保存整个文件 (VIM 教程)。为了确保正确保存,

请再次输入 :!dir 查看您的目录列表内容。

---> 请注意∶如果您退出 VIM 然后在以文件名 TEST 为参数进入,那么该文件内

容应该同您保存时的文件内容是完全一样的。

5. 现在您可以通过输入 :!rm TEST 来删除 TEST 文件了。

~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

第五讲第三节∶一个具有选择性的保存命令

** 要保存文件的部分内容,请输入 :#,# w FILENAME **

1. 再来执行一次 :!dir 或者 :!ls 获知当前目录的内容,然后选择一个合适的

不重名的文件名,比如 TEST 。

2. 接著将光标移动至本页的最顶端,然后按 CTRL-g 找到该行的行号。别忘了

行号哦。

3. 接著把光标移动至本页的最底端,再按一次 CTRL-g 。也别忘了这个行好哦。

4. 为了只保存文章的某个部分,请输入 :#,# w TEST 。这里的 #,# 就是上面

要求您记住的行号(顶端行号,底端行号),而 TEST 就是选定的文件名。

5. 最后,用 :!dir 确认文件是否正确保存。但是这次先别删除掉。

~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

第五讲第四节∶提取和合并文件

** 要向当前文件中插入另外的文件的内容,请输入 :r FILENAME **

1. 请键入 :!dir 确认您前面创建的 TEST 文件还在。

2. 然后将光标移动至当前页面的顶端。

特别提示∶ 执行步骤3之后您将看到第五讲第三节,请届时再往下移动回到这里来。

3. 接著通过 :r TEST 将前面创建的名为 TEST 的文件提取进来。

特别提示∶您所提取进来的文件将从光标所在位置处开始置入。

4. 为了确认文件已经提取成功,移动光标回到原来的位置就可以注意有两份第

五讲第三节,一份是原本,另外一份是来自文件的副本。

~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

第五讲小结

1. :!command 用于执行一个外部命令 command。

请看一些实际例子∶

:!dir - 用于显示当前目录的内容。

:!rm FILENAME - 用于删除名为 FILENAME 的文件。

2. :w FILENAME 可将当前 VIM 中正在编辑的文件保存到名为 FILENAME 的文

件中。

3. :#,#w FILENAME 可将当前编辑文件第 # 行至第 # 行的内容保存到文件

FILENAME 中。

4. :r FILENAME 可提取磁盘文件 FILENAME 并将其插入到当前文件的光标位置

后面。

~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

第六讲第一节∶打开类命令

** 输入 o 将在光标的下方打开新的一行并进入插入模式。**

1. 请将光标移动到本节中下面标记有 ---> 的那一行。

2. 接著输入小写的 o 在光标 *下方* 打开新的一行并进入插入模式。

3. 然后复制标记有 ---> 的行并按 键退出插入模式而进入正常模式。

---> After typing o the cursor is placed on the open line in Insert mode.

4. 为了在光标 *上方* 打开新的一行,只需要输入大写的 O 而不是小写的 o

就可以了。请在下行测试一下吧。当光标处在在该行上时,按 Shift-O可以

在该行上方新开一行。

Open up a line above this by typing Shift-O while the cursor is on this line.

~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

第六讲第二节∶光标后插入类命令

** 输入 a 将可在光标之后插入文本。 **

1. 请在正常模式下通过输入 $ 将光标移动到本节中下面标记有 ---> 的第一行

的末尾。

2. 接著输入小写的 a 则可在光标之后插入文本了。大写的 A 则可以直接在行

末插入文本。

提示∶输入大写 A 的操作方法可以在行末插入文本,避免了输入 i,光标定位到

最后一个字符,输入的文本, 回复正常模式,箭头右键移动光标以及

x 删除当前光标所在位置字符等等诸多繁杂的操作。

3. 操作之后第一行就可以补充完整了。请注意光标后插入文本与插入模式是基

本完全一致的,只是文本插入的位置定位稍有不同罢了。

---> This line will allow you to practice

---> This line will allow you to practice appending text to the end of a line.

~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

第六讲第三节∶另外一个置换类命令的版本

** 输入大写的 R 可连续替换多个字符。**

1. 请将光标移动到本节中下面标记有 ---> 的第一行。

2. 移动光标到第一行中不同于标有 ---> 的第二行的第一个单词的开始,即单

词 last 处。

3. 然后输入大写的 R 开始把第一行中的不同于第二行的剩余字符逐一输入,就

可以全部替换掉原有的字符而使得第一行完全雷同第二行了。

---> To make the first line the same as the last on this page use the keys.

---> To make the first line the same as the second, type R and the new text.

4. 请注意∶如果您按 退出置换模式回复正常模式,尚未替换的文本将仍

然保持原状。

~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

第六讲第四节∶设置类命令的选项

** 设置可使查找或者替换可忽略大小写的选项 **

1. 要查找单词 ignore 可在正常模式下输入 /ignore 。要重复查找该词,可以

重复按 n 键。

2. 然后设置 ic 选项(ic就是英文忽略大小写Ignore Case的首字母缩写词),即

输入∶

:set ic

3. 现在可以通过键入 n 键再次查找单词 ignore。重复查找可以重复键入 n 键。

4. 然后设置 hlsearch 和 incsearch 这两个选项,输入以下内容∶

:set hls is

5. 现在可以再次输入查找命令,看看会有什么效果∶

/ignore

~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

第六讲小结

1. 输入小写的 o 可以在光标下方打开新的一行并将光标置于新开的行首,进入

插入模式。

输入大写的 O 可以在光标上方打开新的一行并将光标置于新开的行首,进入

插入模式。

2. 输入小写的 a 可以在光标所在位置之后插入文本。

输入大写的 A 可以在光标所在行的行末之后插入文本。

3. 输入大写的 R 将进入替换模式,直至按 键退出替换模式而进入正常

模式。

4. 输入 :set xxx 可以设置 xxx 选项。

~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

第七讲∶在线帮助命令

** 使用在线帮助系统 **

Vim 拥有一个细致全面的在线帮助系统。要启动该帮助系统,请选择如下三种方

法之一∶

- 按下 键 (如果键盘上有的话)

- 按下 键 (如果键盘上有的话)

- 输入 :help <回车>

输入 :q <回车> 可以关闭帮助窗口。

提供一个正确的参数给":help"命令,您可以找到关于该主题的帮助。请试验以

下参数(可别忘了按回车键哦。∶

:help w <回车>

:help c_

:help insert-index <回车>

:help user-manual <回车>

~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

第八讲∶创建一个启动脚本

** 启用vim的功能 **

Vim的功能特性要比vi多得多,但大部分功能都没有缺省激活。为了启动更多的

功能,您得创建一个vimrc文件。

1. 开始编辑vimrc文件,这取决于您所使用的操作系统∶

:edit ~/.vimrc 这是Unix系统所使用的命令

:edit $VIM/_vimrc 这是Windows系统所使用的命令

2. 接着导入vimrc范例文件∶

:read $VIMRUNTIME/vimrc_example.vim

3. 保存文件,命令为∶

:write

在下次您启动vim的时候,编辑器就会有了语法高亮的功能。

前往红联论坛参与此主题的讨论   如果有疑问,请

__________________

希望能和你相互交流,愿意和您分享学习、进步中的每分喜悦与快乐

---------------------------------------------

http://tzhsuccess.itpub.net

向版主反映这个帖子 查看tzhsuccess 的IP地址

153楼 旧帖 06-07-17 23:41

[ 大 中 小 ] 给予该贴好评 编辑/删除 引用/回复

tzhsuccess

高级会员

注册日期: 2004 Apr

来自: 太?系-?子座

技术贴数:7934

论坛积分:31670

论坛排名:67

论坛徽章:23

会员2006贡献徽章 行业板块每日发贴之星 ERP板块每日发贴之星

使用命令历史的窍门

使用命令历史的其它方法有哪些?

如果你键入 history ,你会看到一个用数字编号的列表快速从屏幕上卷过,向你显示你所使用的前 500 个命令。

你可能不需要查看这 500 个命令中的所有项目,因此命令 history 20 可能会更有用。这个命令只会显示你键入的前 20 个命令(你可以把 history 命令的参数改变成任何数量)。

其它捷径

下面是一些可能会对你有用的其它命令历史捷径:

0 “梆,梆”:键入 !! (叫做“梆,梆”)来执行历史中的最后一项命令。

0 “梆 数字 ”:键入 ! 数字 (如 !302 )会执行命令历史文件中的第 302 项。

0 “梆 字串 ”:键入 ! 字串 (如 !rpm )会执行命令行中匹配该字串的最新近输出的命令。

0 [向上箭头] 和 [向下箭头] :在 shell 或 GUI 终端提示下,你只需按向上箭头来向后翻阅命令历史(向下箭头会向前翻阅),直到你找到所需命令为止。按 [Enter] 键来执行该命令,就如同你在命令行中键入它一样。

前往红联论坛参与此主题的讨论   如果有疑问,请前往这里提交你的问题,我们将尽力帮你解决

红联论坛

__________________

希望能和你相互交流,愿意和您分享学习、进步中的每分喜悦与快乐

---------------------------------------------

http://tzhsuccess.itpub.net

向版主反映这个帖子 查看tzhsuccess 的IP地址

154楼 旧帖 06-07-17 23:41

[ 大 中 小 ] 给予该贴好评 编辑/删除 引用/回复

tzhsuccess

高级会员

注册日期: 2004 Apr

来自: 太?系-?子座

技术贴数:7934

论坛积分:31670

论坛排名:67

论坛徽章:23

会员2006贡献徽章 行业板块每日发贴之星 ERP板块每日发贴之星

书籍由红联论坛的海情委托我制作完成。书籍没有什么特别之处,就是选取了红联论坛当中的Linux Shell教程版块的精华文章,制作此书籍的目的是给大家一个离线学习平台。

注:如果你喜欢红联论坛出的电子书籍,请关注红联论坛书籍下载区。如果你不能正常看到正上方中间的logo,那么遗憾的告诉你,你不能访问红联论坛,如果显示正常欢迎你访问红联论坛。

  本文档的文章来自红联论坛,如果文章的作者认为我们侵犯了你的权利到红联论坛申诉,他们将做一妥当的处理。

 

   红联论坛致力于Linux技术文章,教程的站点,目前网站收录的文章及教程基本能满足不同水平的朋友学习,欢迎大家到红联论坛来学习,讨论问题。

__________________

希望能和你相互交流,愿意和您分享学习、进步中的每分喜悦与快乐

---------------------------------------------

http://tzhsuccess.itpub.net

向版主反映这个帖子 查看tzhsuccess 的IP地址

155楼 旧帖 06-07-17 23:42

[ 大 中 小 ] 给予该贴好评 编辑/删除 引用/回复

tzhsuccess

高级会员

注册日期: 2004 Apr

来自: 太?系-?子座

技术贴数:7934

论坛积分:31670

论坛排名:67

论坛徽章:23

会员2006贡献徽章 行业板块每日发贴之星 ERP板块每日发贴之星

提高Import命令的性能

  如果是在分区数据库的环境下,可以利用Buffered Insert来提高IMPORT的性能:

在执行IMPORT命令前,要先用INSERT BUF参数重新绑定IMPORT命令对应的绑定文件db2uimpm.bnd 。

例如:

db2 connect to 数据库名

db2 bind db2uimpm.bnd blocking all insert buf

db2uimpm.bnd在..sqllib\bnd目录下。

执行IMPORT命令时使用COMPOUND参数:

例如:

db2 connect to 数据库名

db2 import from 数据文件名 of ixf modified by compound=100 insert into 表名

上面的命令中IMPORT会在每100条记录而不是每条记录插入后等待返回的SQL执行结果。

如果表中已有数据,将表的属性修改为APPEND MODE也可以加快IMPORT的性能。

前往红联论坛参与此主题的讨论   如果有疑问,请前往这里提交你的问题,我们将尽力帮你解决

红联论坛

__________________

希望能和你相互交流,愿意和您分享学习、进步中的每分喜悦与快乐

---------------------------------------------

http://tzhsuccess.itpub.net

向版主反映这个帖子 查看tzhsuccess 的IP地址

156楼 旧帖 06-07-17 23:42

[ 大 中 小 ] 给予该贴好评 编辑/删除 引用/回复

tzhsuccess

高级会员

注册日期: 2004 Apr

来自: 太?系-?子座

技术贴数:7934

论坛积分:31670

论坛排名:67

论坛徽章:23

会员2006贡献徽章 行业板块每日发贴之星 ERP板块每日发贴之星

提高linux命令行的工作效率

   虽然最近几年个人计算机的潮流已经从命令行方式转向图形界面方式,大量的采用鼠标操作,但是shell 在Linux中依然有很强的生命力。shell有好几种,主要有bash、ksh、tcsh、zsh、ash,用得最多的是bash,它几乎是各种linux发布版的标准配置。同时在linux 操作系统中,即使在X Window下,系统管理员经常也要与命令行打交道,使用键盘次数要明显高于鼠标,本文通过介绍合理地定制与修改INPUTRC环境变量,以及利用bash 2.05以上版本中增加的complete命令,可以更好地提高linux命令行使用的工作效率,减少键盘的敲打以及拼写错误。

一.定制/etc/inputrc文件:

   通过设置INPUTRC环境变量(参见/etc/profile文件),其作用主要定义或者改变一些功能键的定义,从而更好地使用命令行,通常情况下INPUTRC环境变量指向 /etc/inputrc文件,只要编辑/etc/inputrc文件,以及利用Tab键的命令补全功能,就可以实现类似于MSDOS的DOSKEY的功能。

   以Redhat 7.3为例来说明,使用的bash shell版本号为2.0.5。你可以根据自己的需要定制与修改此文件,如想了解更多的内容,可以参阅man bash文档。

   例子:/etc/inputrc文件内容如下:

   set bell-style none

   set meta-flag on

   set input-meta on

   set convert-meta off

   set output-meta on

   set show-all-if-ambiguous On

   "e[1~": beginning-of-line # home

   "e[2~": insert-last-argument # insert

   "e[3~": delete-char # delete

   "e[4~": end-of-line # end

   "e[5~": backward-kill-word # page up

   "e[6~": kill-word # page down

   # (F1 .. F5) are "e[[A" ... "e[[E"

   "e[18~": history-search-forward # F7

   "e[19~": history-search-backward # F8

   具体修改说明如下(注以下[]中的内容为所按的键):

   set bell-style none

   关闭计算机小喇叭发出的声音。

set meta-flag on

set input-meta on

set convert-meta off

set output-meta on

   这几行主要是实现命令行上实现汉字的输入以及显示。 比如想输入汉字的文件名等等。

set show-all-if-ambiguous On

   这一行主要是使命令补全的功能更好的发挥。许多Linux初学者并不知道这个功能,就是使用[Tab]键,能够减少键盘的敲打以及拼写错误。比如当前你想执行ifconfig命名,你输入if后按[Tab]键两次,就会出现所有以if开头的命令,文件名和目录名也可以使用这个方法输入,当打开上述命令后可以使用[Tab]键,仅仅需要按一次,这样更加方便与快捷。

"e[1~": beginning-of-line # home

"e[2~": insert-last-argument # insert

"e[3~": delete-char # delete

"e[4~": end-of-line # end

"e[5~": backward-kill-word # page up

"e[6~": kill-word # page down

   这几行主要是使命令行编辑方便,[home]、[delete]、[end]键保持原意,意指移动到命令行的开始、删除一个字符、移动到命令行尾。[insert] 键被定义为插入上一个命令的最后一个参数。比如执行如下命令:

$ mount /mnt/cdrom

$ cd[space][insert]

     # 相当于 执行 cd /mnt/cdrom

   可以试着按[insert]键几次看看会有什么出现内容?

   [Pageup]和[PageDown]键定义为向前和向后删除单词。

"e[18~": history-search-forward # F7

"e[19~": history-search-backward # F8

   [F7]和[F8]定义为命令历史查找功能,有点向MSDOS的DOSKEY功能类似,比如前面使用过mount命令,再次输入mount后按[F8]会调出先前使用的命令,特别是当命令非常长参数非常多的时候。

二.安装bash-completion:

   如果经常你使用[tab]键命令补全功能,就会发现它的不足之处,你可以发现它不能根据具体的需要或者命令补全所需要的参数与文件或者目录。例如你执行cd [tab],系统会将文件与目录一起显示出来,而实际上这时你仅仅需要显示文件类型为目录。bash从2.05版开始,已经加入命令complete内部命令,从而能够使用复杂的命令行接口,通过一个复杂的脚本bash_completion实现可编程的补全程序,减少系统管理员日常维护工作,减少差错提高工作效率。

   具体操作如下:

   1. 下载最新的bash-completiton脚本,检查bash的版本号【执行bash --version】,如果版本低于2.0.5最好升级bash.

  

   ... sh-2.05-51.i386.rpm

   2. 安装

# rpm -Uvh bash-2.05-12.i386.rpm

# tar xzvf bash-completion-latest.tar.gz -C /tmp

   3. 仔细阅读bash_completetion目录下的README文件,修改/etc/bashrc文件,在行尾加入如下命令:

bash=${BASH_VERSION%.*}; bmajor=${bash%.*}; bminor=${bash#*.}

if [ "$PS1" ] && [ $bmajor -eq 2 ] && [ $bminor '>' 04 ]

&& [ -f /etc/bash_completion ]; then # interactive shell

# Source completion code

. /etc/bash_completion

fi

unset bash bmajor bminor

   4. 拷贝bash_completion文件:

# cp /tmp/bash_completion/bash_completion /etc

   注销再重新进入后,你就会发现许多命令在使用命令补全时都会发生一些变化。

   通过以上的修改,你会发现在命令行上使用linux,同样高效与快捷,减少了许多不必要的错误。

__________________

希望能和你相互交流,愿意和您分享学习、进步中的每分喜悦与快乐

---------------------------------------------

http://tzhsuccess.itpub.net

向版主反映这个帖子 查看tzhsuccess 的IP地址

157楼 旧帖 06-07-17 23:42

[ 大 中 小 ] 给予该贴好评 编辑/删除 引用/回复

tzhsuccess

高级会员

注册日期: 2004 Apr

来自: 太?系-?子座

技术贴数:7934

论坛积分:31670

论坛排名:67

论坛徽章:23

会员2006贡献徽章 行业板块每日发贴之星 ERP板块每日发贴之星

网中人“shell十三问之变量替换” 外传(初学shell必看)

初看第八问,不解。想:其它初学shell者亦同。故解之!

变量替换:

一:简单赋值和替换

a=bcd

$ echo $a

bcd

$ echo ${a}

bcd

二:变量扩充

除了shell中的meta,其它的[^a-zA-Z0-9_]几乎都可以作单词边界。

同sed中关于单词边界[^a-zA-Z0-9_]的描述。

这些功能有时候会在程序中有意想不到的作用!

例如:

$ a=bcd

$ echo ${a}.b

bcd.b

$ echo $a.php

bcd.php

$ echo $a%b

bcd%b

$ echo /$a/bc

/bcd/bc

对于shell中的meta字符,则backslash。

$ echo $a\*b

bcd*b

三:变量中的变量

$ a=bcd

$ b=efg

$ c=$a$b

$ echo $c

bcdefg

$ d=$c.ghi

$ echo $d

bcdefg.ghi

思考:若变量互相嵌套,会怎样呢?

四:变量的特异功能

到网中人的啦!(ps:重写真是没激情啊)

file=/dir1/dir2/dir3/my.file.txt

我们可以用 ${ } 分别替换获得不同的值:

${file#*/}:从变量file的字符串左边开始,删除字符直到第一个“/”:dir1/dir2/dir3/my.file.txt

${file##*/}:从变量file的字符串左边开始,删除字符直到最后一个“/”:my.file.txt

${file#*.}:从变量file的字符串左边开始,删除字符直到第一个“.”:file.txt

${file##*.}:从变量file的字符串左边开始,删除字符直到最后一个“.”:txt

其实,在“#”后面,无非就是一个匹配问题,不限于两个,你可以放任意个字符,还可以用shell中另外的通配符“?”“[…]”“[!…]”,例如:

$ echo ${file#????}

1/dir2/dir3/my.file.txt

$ echo ${file#*[0-9]}

/dir2/dir3/my.file.txt

$ echo ${file#/dir1/dir[0-9]}

/dir3/my.file.txt

“#”:相当于最小匹配,遇到一个最小的符合其后表达式的字符串(单个或多个)即中止匹配动作;

“##”:相当于最大匹配,它尽可能的匹配更多的字符。

我们可以拿“*”来说明:

* 在shell中表示匹配任何符号包括空。当它在只有一个 # 的变量替换中,受最小匹配的影响,它不会匹配任何可打印字符,只匹配一个空,也就是什么也不匹配,你完全可以忽略它的存在;

当在有两个 ## 的变量替换中,受最大匹配的影响,一个 * 表示匹配整个字符串。

如果想匹配字符“*”时,要在“*”前加一个“\”,其后的“*”失去通配符的功能。

但是还有一种例外情况(请接着看)

例:

$ file2=abcd.efgh.ijkl.oopp

$ echo ${file2#*.*.*.*}

$ echo ${file2##*.*.*.*}

想想上面两个的输出是什么?

$ echo ${file2#*.*.*.*}

oopp

$ echo ${file2##*.*.*.*}

??知道为什么吗?因为:“*”匹配任何符号包括空。遇到一个“#”时,最后一个“*”就匹配“空”去了。看下面的:

$ echo ${file2#*.*.*.?}

opp

$ echo ${file2#*.*.*.?*}

opp

$ echo ${file2##*.*.*.?}

opp

$ echo ${file2##*.*.*.?*}

do you know?

$ echo $file3

*ab*de*cd

看看下面将输出什么?

$ echo ${file3#*ab}

*de*cd

$ echo ${file3#**}

*ab*de*cd

$ echo ${file3##**}

$ echo ${file3#\*ab}

*de*cd

$ echo ${file3#\**}

ab*de*cd

$ echo ${file3##\**}

$ echo ${file3#*a}

b*de*cd

$ echo ${file3#\*a}

b*de*cd

不知各位有没有发现,“*”在一个“#”中时,并不一定代表“空”,它可能代表一个字符“*”也可能代表其他的什么字符,如上例的:

“$ echo ${file3#*a}”输出为“b*de*cd”,其实这还是符合最小匹配理论的。这个表达式的意思是:从变量file3的字符串左边开始删除字符,直到遇到第一个字符“a”。所以不要和“$ echo ${file3#\*a}”混淆,虽然两个结果是一样,但意思是不一样的。

再举几个例子,相信大家更容易理解这段话:

$ echo $file3

*ab*de*cd*ab*de //注意:出现两个“*ab”

$ echo ${file3#*a}

b*de*cd*ab*de //删除字符,直到出现第一个“a”,“*”为通配符

$ echo ${file3##*a}

b*de //删除字符,直到出现第二个“a”,“*”为通配符

$ echo ${file3##\*a}

b*de*cd*ab*de //删除字符串“*a”,“*”在“\”表示字符“*”

除了通配符“*”比较难理解一点,其他的shell通配符就都很容易了。

至于“%”,和“#”不同的地方,就是从变量字串右部开始。

${file%/*}:从右部开始拿掉字符,直到遇到(从右部数起的)第一个“/” :/dir1/dir2/dir3

${file%%/*}:从右部开始拿掉字符,直到遇到(从右部数起的)最后一个“/”:(空值)

${file%.*}:从右部开始拿掉字符,直到遇到(从右部数起的)第一个“.”:/dir1/dir2/dir3/my.file

${file%%.*}:从右部开始拿掉字符,直到遇到(从右部数起的)最后一个“.”:/dir1/dir2/dir3/my

前往红联论坛参与此主题的讨论   如果有疑问,请前往这里提交你的问题,我们将尽力帮你解决

红联论坛

__________________

希望能和你相互交流,愿意和您分享学习、进步中的每分喜悦与快乐

---------------------------------------------

http://tzhsuccess.itpub.net

向版主反映这个帖子 查看tzhsuccess 的IP地址

158楼 旧帖 06-07-17 23:42

[ 大 中 小 ] 给予该贴好评 编辑/删除 引用/回复

tzhsuccess

高级会员

注册日期: 2004 Apr

来自: 太?系-?子座

技术贴数:7934

论坛积分:31670

论坛排名:67

论坛徽章:23

会员2006贡献徽章 行业板块每日发贴之星 ERP板块每日发贴之星

详解Bash命令行处理

很多兄弟写脚本或命令时出现错误的主要原因,是因为不了解bash的命令行处理。我在这里总结了一下,大家可以参考一下。其中也涉及到双引号,单引号以及eval的技巧,我会一一讲述。

Shell从标准输入或脚本中读取的每行称为一个管道行,它包含一个或多个由0个或多个管道字符(|)分隔的命令。对每一个管道行,进行12个步骤的处理。

一、bash命令处理的12个步骤;

 

QUOTE:

+-------------+ 单引号

|------------------------->| |--------------------------|

| ----------------------->| 1.分隔成记号|---- ---------------| |

| | ------------------->| | 双引号 | |

| | | +-------------+ | |

| | | || | |

| | |读取下一个命令 \/ | |

| | | +-------------------------------------------+ | |

| | | | 2. | | |

| | ------| 检验第一个记号 | | |

| | |开放的关键字 其他关键字 | | |

| | | 非关键字 | | |

| | +-------------------------------------------+ | |

| | || | |

| | \/ | |

| | +-----------------------------+ | |

| | 扩展别名 | 3. 检验第一个记号 | | |

| |------------| 别名 | | |

| | 不是别名 | | |

| +-----------------------------+ | |

| || | |

| \/ | |

| +--------------+ | |

| | 4.大括号扩展 | | |

| +--------------+ | |

| || | |

| \/ | |

| +--------------+ | |

| | 5.~符号扩展 | | |

| +--------------+ | |

| || | |

| \/ | |

| +--------------+ 双引号 | |

| | 6.参数扩展 | <-----------------| |

| +--------------+ |

| || |

| \/ |

| +------------------------------+ |

| | 7.命令替换(嵌套命令行处理) | |

| +------------------------------+ |

| || |

| \/ |

| +--------------+ 双引号 |

| | 8.算术扩展 |------------------| |

| +--------------+ | |

| || | |

| \/ | |

| +--------------+ | |

| | 9.单词分割 | | |

| +--------------+ | |

| || | |

| \/ | |

| +--------------+ | |

| | 10.路径名扩展| | |

| +--------------+ | |

| || | |

| \/ | |

| +----------------------------------------+ | |

| | 11.命令查寻:函数,内置命令,可执行文件| <---|-----|

| +----------------------------------------+

| ||

| \/

|将参数带入下一个命令 +-------------+

|----------eval--------------| 12.运行命令 |

+-------------+

结合上面的插图,这里给出命令行的12个步骤。

1、将命令行分成由固定元字符集分隔的记号;

SPACE, TAB, NEWLINE, ; , (, ), <, >, |, &

记号类型包括单词,关键字,I/O重定向符和分号。

2、检测每个命令的第一个记号,查看是否为不带引号或反斜线的关键字。

如果是一个开放的关键字,如if和其他控制结构起始字符串,function,{或(,则命令实际上为一复合命令。shell在内部对复合命令进行处理,读取下一个命令,并重复这一过程。如果关键字不是复合命令起始字符串(如then等一个控制结构中间出现的关键字),则给出语法错误信号。

3、依据别名列表检查每个命令的第一个关键字;

如果找到相应匹配,则替换其别名定义,并退回第一步;否则进入第4步。该策略允许递归别名,还允许定义关键字别名。如alias procedure=function

4、执行大括号扩展,例如a{b,c}变成ab ac

5、如果~位于单词开头,用$HOME替换~。

使用usr的主目录替换~user。

6、对任何以符号$开头的表达式执行参数(变量)替换;

7、对形式$(string)的表达式进行命令替换;

这里是嵌套的命令行处理。

8、计算形式为$((string))的算术表达式;

9、把行的参数,命令和算术替换部分再次分成单词,这次它使用$IFS中的字符做分割符而不是步骤1的元字符集;

10、对出现*, ?, [ / ]对执行路径名扩展,也称为通配符扩展;

11、按命令优先级表(跳过别名),进行命令查寻;

12、设置完I/O重定向和其他操作后执行该命令。

二、关于引用

1、单引号跳过了前10个步骤,不能在单引号里放单引号

2、双引号跳过了步骤1~5,步骤9~10,也就是说,只处理6~8个步骤。

也就是说,双引号忽略了管道字符,别名,~替换,通配符扩展,和通过分隔符分裂成单词。

双引号里的单引号没有作用,但双引号允许参数替换,命令替换和算术表达式求值。可以在双引号里包含双引号,方式是加上转义符"\",还必须转义$, `, \。

三、eval的作用;

eval的作用是再次执行命令行处理,也就是说,对一个命令行,执行两次命令行处理。这个命令要用好,就要费一定的功夫。我举两个例子,抛砖引玉。

1、例子1:用eval技巧实现shell的控制结构for

用eval技巧实现shell的控制结构for。

[root@home root]# cat myscript1

 

QUOTE:

#!/bin/sh

evalit(){

if [ $cnt = 1 ];then

eval $@

return

else

let cnt=cnt-1

evalit $@

fi

eval $@

}

cnt=$1

echo $cnt | egrep "^[1-9][0-9]*$" >/dev/null

if [ $? -eq 0 ]; then

shift

evalit $@

else

echo 'ERROR!!! Check your input!'

fi

[root@home root]# ./myscript1 3 hostname

home

home

home

[root@home root]# ./myscript1 5 id |cut -f1 -d' '

uid=0(root)

uid=0(root)

uid=0(root)

uid=0(root)

uid=0(root)

注意:bash里有两个很特殊的变量,它们保存了参数列表。

$*,保存了以$IFS指定的分割符所分割的字符串组。

$@,原样保存了参数列表,也就是"$1""$2"...

这里我使用了函数递归以及eval实现了for结构。

当执行eval $@时,它经历了步骤如下:

第1步,分割成eval $@

第6步,扩展$@为hostname

第11步,找到内置命令eval

重复一次命令行处理,第11步,找到hostname命令,执行。

注意:也许有人想当然地认为,何必用eval呢?直接$@来执行命令就可以了嘛。

例子2:一个典型错误的例子

错误!这里给个典型的例子大家看看。

[root@home root]# a="id | cut -f1 -d' '"

[root@home root]# $a

id:无效选项 -- f

请尝试执行‘id --help’来获取更多信息。

[root@home root]# eval $a

uid=0(root)

如果命令行复杂的话(包括管道或者其他字符),直接执行$a字符串的内容就会出错。分析如下。

$a的处理位于第6步──参数扩展,也就是说,跳过了管道分析,于是"|", "cut", "-f1", "-d"都变成了id命令的参数,当然就出错啦。

但使用了eval,它把第一遍命令行处理所得的"id", "|", "cut", "-f1", "-d"这些字符串再次进行命令行处理,这次就能正确分析其中的管道了。

总而言之:要保证你的命令或脚本设计能正确通过命令行处理,跳过任意一步,都可能造成意料外的错误!

例子3:设置系统的ls色彩显示

eval $(dircolors -b /etc/dircolors)

eval语句通知shell接受eval参数,并再次通过命令行处理的所有步骤运行它们。

它使你可以编写脚本随意创建命令字符串,然后把它们传递给shell执行;

$()是命令替换,返回命令的输出字符串。

其中dircolors命令根据/etc/dircolors配置文件生成设置环境变量LS_COLORS的bash代码,内容如下

[root@localhost root]# dircolors -b > tmp

[root@localhost root]# cat tmp

LS_COLORS='no=00:fi=00:di=01;34:ln=01; ......

export LS_COLORS

#这里我没有指定配置文件,所以dircolors按预置数据库生成代码。

其输出被eval命令传递给shell执行。

eval是对Bash Shell命令行处理规则的灵活应用,进而构造"智能"命令实现复杂的功能。

上面提及的命令是eval其中一个很普通的应用,它重复了1次命令行参数传递过程,纯粹地执行命令的命令。

其实它是bash的难点,是高级bash程序员的必修之技。

四、命令优先级表

1、别名

2、关键字

3、函数

4、内置命令

5、脚本或可执行程序($PATH)

五、鉴于一些学习中会遇到的困惑,我再给出一些有趣的命令。

1、command builtin enable

上面的命令行提及过,第11步会进行命令查找,那它的具体过程如何呢?

它的默认查找次序为函数,内部命令,脚本和可执行代码。我们往往要在实际编程中跳过一些查找项以满足一定的功能需求。这时候就要用到这三个命令来施展魔法~~

2、command

跳过别名和函数的查找,换句话说,它只查找内部命令以及搜索路径中找到的脚本或可执行程序。

这里举个有趣的例子。

[root@home root]# type -all pwd

 

QUOTE:

pwd is a shell builtin

pwd is /bin/pwd

[root@home root]# cat myscript2

#!/bin/sh

pwd(){

echo "This is the current directory."

command pwd

}

pwd

[root@home root]# ./myscript2

This is the current directory.

/root

我用pwd()函数取代了内置命令pwd以及外部命令/bin/pwd,然后在脚本里执行内置命令pwd。在这里我们为什么要用command呢?是为了避免函数陷入递归循环,因为函数名与内置命令同名,而函数的优先级比内置命令高。

3、builtin

顾名思义,它只查找内置命令。这个命令很简单,就不多说了。

4、enable

与builtin相反,它屏蔽一个内置命令,允许运行一个shell脚本或同名的可执行代码而无须给出完全路径名。

举个例子吧。

pwd命令有两个,一个是shell内置的,一个是可执行程序。

当执行一些奇怪的路径名后,shell内置的pwd会打印出"错误信息",但外部的pwd会打印出当前目录的"原来面目"。请看下面:

[root@home root]# cd //

[root@home //]# pwd

//

[root@home //]# type -all pwd

pwd is a shell builtin

pwd is /bin/pwd

[root@home //]# /bin/pwd

/

[root@home //]# enable -n pwd

[root@home //]# pwd

/

这样,用enable -n屏蔽内置pwd命令后,就可以用外部pwd打印出正确的路径名了。

Bash博大精深,希望大家好好学习。

前往红联论坛参与此主题的讨论   如果有疑问,请前往这里提交你的问题,我们将尽力帮你解决

红联论坛

__________________

希望能和你相互交流,愿意和您分享学习、进步中的每分喜悦与快乐

---------------------------------------------

http://tzhsuccess.itpub.net

向版主反映这个帖子 查看tzhsuccess 的IP地址

159楼 旧帖 06-07-17 23:42

[ 大 中 小 ] 给予该贴好评 编辑/删除 引用/回复

tzhsuccess

高级会员

注册日期: 2004 Apr

来自: 太?系-?子座

技术贴数:7934

论坛积分:31670

论坛排名:67

论坛徽章:23

会员2006贡献徽章 行业板块每日发贴之星 ERP板块每日发贴之星

新手必看:FDISK命令的常用方法

fdisk命令的常用方法:

删除分区,如果对/dev/sda设备进行分区操作: fdisk /dev/sda

屏幕提示: Command (m for help):

键入p 屏幕会列出当前所有的分区设备号、大小、文件格式等参数;

下面进行删除分区的操作: 屏幕提示: Command (m for help):

键入d 屏幕提示: Partition number (1-x): x是您现有的分区数量,有两个分区的话x就是2;删除分区时从最后一个分区开始,

键入2: 屏幕提示: Command (m for help): 键入p 列出当前分区情况,发现sda2被删除了;

继续键入d,然后是1,

再键入p,发现sda的分区都被删除了; 屏幕提示: Command (m for help):

键入w 保存当前删除的操作,回到主界面,如果/dev/sdb上也有分区,按照上面的方法删除。

下面进行创建分区的操作: fdisk /dev/sda 屏幕提示: Command (m for help):

键入p 此时硬盘上应该没有任何分区;

键入n 屏幕提示: First cylinder (abcd-efgh, default abcd): abcd和efgh都是数字,表示新分区起始的 柱面数,直接键入回车即可; 屏幕提示: Last cylinder or +size or +sizeM or +sizeK (abcd-ijkl, default ijkl): abcd和 ijkl也都是数字,这里是要求定义分区的大小,如果要建立2G的空间,键入+2000M,如果要将后面所有空间都分出来,直接键入回车即可;注意分区大小的单位M和K一定要大写! 屏幕提示: Command (m for help):

键入p 发现已经建立了分区sda1,大小是2G 仿照上面的方法建立更多分区,可以用p查看,最后键入w保存操作.

阅读(2365) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~