一,什么是Shell?
shell是你(用户)和Linux(或者更准确的说,是你和Linux内核)之间的接口程序。你在提示符下输入的
每个命令都由shell先解释然后传给Linux内核。
shell 是一个命令语言解释器(command-languageinterpreter)。拥有自己内建的shell命令集。此外,
shell也能被系统中其他有效的Linux 实用程序和应用程序(utilities andapplicationprograms)所调用。
不论何时你键入一个命令,它都被Linux shell所解释。一些命令,比如打印当前工作目录命令(pwd),
是包含在Linux bash内部的(就象DOS的内部命令)。其他命令,比如拷贝命令(cp)和移动命令(rm),是存在于
文件系统中某个目录下的单独的程序。而对用户来说,你不知道(或者可能不关心)一个命令是建立在shell内部还
是一个单独的程序。
二,shell 是如何执行命令解释的?
shell 首先检查命令是否是内部命令,不是的话再检查是否是一个应用程序,这里的应用程序可以是Linux
本身的实用程序,比如ls 和 rm,也可以是购买的商业程序,比如xv,或者是公用软件(public domain software),
就象Ghostview。然后shell试着在搜索路径里寻找这些 应用程序。搜索路径是一个能找到可执行程序的目录列表。
如果你键入的命令 不是一个内部命令并且在路径里没有找到这个可执行文件,将会显示一条错误 信息。而如果命令
被成功的找到的话,shell的内部命令或应用程序将被分解为 系统调用并传给Linux内核。
shell的另一个重要特性是它自身就是一个解释型的程序设计语言,shell程序设计语言支持在高级语言里所
能见到的绝大多数程序控制结构,比如循环,函数,变量和数组。shell 编程语言很易学,并且一旦掌握后它将成为
你的得力工具。任何在提示符下能键入的命令也能放到一个可执行的shell程序里,这意味着用shell语言能简单地重
复执行某一任务。
三,shell 如何启动
shell在你成功地登录进入系统后启动,并始终作为你与系统内核的交互手段直至你退出系统。你系统上的
每位用户都有一个缺省的shell。每个用户的缺省shell在系统里的passwd文件里被指定,该文件的路径是/etc/passwd。
passwd文件里还包含有其他东西:每个人的用户ID号,一个口令加密后的拷贝和用户登录后立即执行的程序,(注:
为了加强安全性,现在的系统一般都把加密的口令放在另一个文件--shadow中,而passwd中存放口令的部分以一个x字
符代替)虽然没有严格规定这个程序必须是某个Linux shell,但大多数情况下都如此。
四,最常用的shell
在Linux 和 UNIX系统里可以使用多种不同的shell可以使用。最常用的几种是Bourne shell (sh), C shell
(csh), 和 Korn shell (ksh)。三种shell 都有它们的优点和缺点。
1,Bourne shell 的作者是 Steven Bourne。它是 UNIX最初使用的shell并且在每种UNIX上都可以使用。
Bourne shell 在 shell编程方面相当优秀,但在处理与用户的交互方面作得不如其他几种 shell。
2,C shell 由 BillJoy所写,它更多的考虑了用户界面的友好性。它支持象命令补齐(command-line
completion)等一些 Bourne shell 所不支持的特性。普遍认为C shell 的编程接口做的不如 Bourne shell, 但
C shell 被很多C程序员使用因为C shell的语法和C语言的很相似,这也是Cshell名称的由来。
3,Korn shell (ksh) 由 Dave Korn 所写。它集合了C shell 和 Bourne shell的优点并且和 Bourne
shell 完全兼容。
除了这些 shell 以外,许多其他的 shell 程序吸收了这些原来的 shell程序的优点而成为新的 shell 。
[1] [2] [3] 下一页
在 Linux 上常见的有 tcsh (csh 的扩展),Bourne Again shell(bash, sh 的 扩展),和Public Domain Korn
shell (pdksh, ksh 的扩展)。
bash 是大多数Linux 系统的缺省 shell。Bourne Again shell (bash), 正如它的名字所暗示的,是
Bourne shell 的扩展。bash 与Bourne shell 完全向后兼容,并且在 Bourne shell 的基础上增加和增强了很多
特性。bash 也包含了很多 C 和 Korn shell 里的优点。bash 有很灵活和强大的编程接口,同时又有很友好的用户
界面。
五, 缺省 shell--bash
为什么要用 bash 来代替 sh 呢?Bourne shell最大的缺点在于它处理用户的输入方面。在 Bourne
shell里键入命令会很麻烦,尤其当你键入很多相似的命令时。而bash准备了几种特性使命令的输入变得更容易。
1,命令补齐(Command-Line Completion)
通常你在 bash (或任何其他的shell)下输入命令时你不必把命令输全shell就能判断出你所要输入的命
令。例如,假定当前的工作目录包含以下的文件和子目录:
News/ bin/ games/ mail/ samplefile/ test/
如果你要进入 test 子目录,你将会输入以下的命令:
cd test
这个命令能够满足你的需要,但bash还提供了稍微不同的方法来完成同样的事。因为 test 是当前目录里
唯一以字母t开头的子目录,bash在你只输入字母 t后就能判断出你要做什么了:
cd t
在你键入那个字母后,唯一的可能就是 test 。想让bash帮你结束命令的话,按下 Tab 键:
cd t
当你这样做以后,bash将帮你补齐命令并显示在屏幕上。但在你按下回车键以前命令并没有被执行,bash
会让你检验补齐的命令是否是你真正需要的。在输入象这样短的命令时你也许看不出它的价值所在,甚至在命令很
短时还会简慢输入的速度,但是当你要输入的命令有点长时,你会发现这个特性是多么的美好。 但是当目录里有不
止一个以字母 t开头的文件时会发生什么情况呢?在你使用命令补齐时会有问题,让我们看看下面的情况,当前目
录里有下列内容:
News/ bin/ mail/ samplefile test/ tools/ working/
现在这个目录里有两个以字母 t 开头的文件。假设你仍然想进入test子目录,如何使用命令补齐呢?如果
你象先前那样键入:
cd t
bash将不知道你到底想进入哪个子目录,因为给出的信息并不唯一。如果你这样做了的话,bash 将发出一
声蜂鸣 提醒你没有足够的信息来补齐你的命令。蜂鸣之后bash并不改变输入的命令,这将使你能在原来的基础上再
输入更多的信息,在这个例子中你仅需再键入一个 e 并再按一下 Tab 键,这时 bash就有足够的信息来完成你的命
令了:
cd test
当你输入命令时不论何时按下 Tab 键,bash都将尽其所能地试图补齐命令,不行的话会发出蜂鸣来提醒你
需要更多的信息。你需要键入更多的字符,并再次按下 Tab键,重复这个过程直至你期望的命令出现。
2,通配符
另一个使命令输入变得更简单的方法是在命令中使用通配符。bash支持三种通配符:
* 匹配任何字符和任何数目的字符
? 匹配任何单字符
[...] 匹配任何包含在括号里的单字符
* 通配符的使用有些象命令补齐。例如,假设当前目录包含以下文件:
News/ bin/ games/ mail/ samplefile/ test/
如果你想进入 test 目录,你将键入 cd test, 或者你想用命令补齐:
cd t
现在有第三种方法来做同样的事。因为仅有一个文件以字母 t 开头,你也能用 *通配符来进入该目录。键
入下列命令:
cd t*
* 匹配任何字符和任何数目的字符,所以 shell 将把 t* 替换为test(当前目录里唯一和通配方案匹配的
文件)。 当前目录里只有一个文件以字母 t开头的话这将是可靠的。但是如果当前目录里有不止一个文件以字母 t
开头, shell将试着进入第一个符合匹配方案的目录,这个目录是以字母表排序的第一个目录,这个目录也许是也许
不是你所期望的。
通配符 *的一个更实际的用途是通配你要执行的命令中的多个名字相似的文件。例如,假设当前目录里包含
以下文件:
ch1.doc ch2.doc ch3.doc chimp config mail/ test/ tools/
如果你需要打印所有扩展名是 .doc 的文件,你能使用象这样简化的命令:
lpr *.doc
在这个例子中,bash 将把 *.doc替换为当前目录下所有文件名符合通配方案的文件。在 bash 进行了替换
上一页 [1] [2] [3] 下一页
后,该命令将被处理为:
lpr ch1.doc ch2.doc ch3.doc
lpr 命令将以ch1.doc, ch2.doc, 和 ch3.doc为参数被调用。
通配符 ? 除了只能匹配单个字符外,其他功能都与通配符 *相同,如果用通配符? 来打印前面提到的那个
目录里所 有扩展名是 .doc的文件的话,键入下面的命令:
lpr ch?.doc
通配符[...]能匹配括号中给出的字符或字符范围。同样以前面的目录为例,打印那个目录里所有扩展名是
.doc 的文件,你可以键入下列命令之一:
lpr ch[123].doc
或者:
lpr ch[1-3].doc
(出处:http://www.sheup.com)
上一页 [1] [2] [3]
lpr ch?.doc
通配符[...]能匹配括号中给出的字符或字符范围。同样以前面的目录为例,打印那个目录里所有扩展名是
.doc 的文件,你可以键入下列命令之一:
lpr ch[123].doc
或者:
lpr ch[1-3].doc
(出处:http://www.sheup.com/)
上一页 [1] [2] [3] [4]