第1章 Linux命令基础
有人说,命令行(command line)是一种过时的技术,难用且神秘,甚至有的人认为 Linux 操作系统根本就不该存在这些东西。对于这种观点,笔者认为他们并不真正地了解 Linux 操作系统。当然,随着 X Windows的发展,用户完全可以在不懂任何Linux命令的前提下,很好地使用 Linux 系统,因为用户可以在系统启动后就直接进入 X Windows,最后也在X Windows下关闭系统。但是,X Windows系统就像一个傻瓜相机,操作虽然简单,但未必能达到最后的效果。事实上,Linux命令是很有趣的,它就像一大堆收集到的积木,能完成许多意想不到的创举.一些极其复杂的工作,只需几行命令就可以解决。因为在 UNIX/Linux 中,shell 可不是简单的命令解释器(典型的有Windows中的DOS),而是一个全功能的编程环境。
1.1 从shell说起
介绍Linux命令,就不得不从shell开始。shell是用户和Linux操作系统之间的接口。Linux中有多种shell,其中默认使用的是bash。
1.1.1 shell(壳)
Linux系统的shell作为操作系统的外壳,为用户提供了使用操作系统的接口。它是命令语言、命令解释程序及程序设计语言的统称。
shell是用户和Linux内核之间的接口程序,如果把Linux内核想象成一个球体的中心, shell就是围绕内核的外层,如图1-1所示。当从shell或其他程序向Linux传递命令时,内核会做出相应的反应。
图1-1 Linux中用户、shell与内核
shell又是一个命令语言解释器,它拥有自己内建的shell命令集,shell也能被系统中其他应用程序所调用。用户在提示符下输入的命令都是由shell解释后传给Linux核心的。
有一些命令,如改变工作目录命令 cd,是包含在 shell 内部的。还有一些命令,如拷贝命令cp和删除命令rm,是存在于文件系统中某个目录下的单独的程序。对用户而言,不必关心一个命令是建立在shell内部还是一个单独的程序。
首先shell检查命令是否是内部命令,若不是再检查是否是一个应用程序(这里的应用程序可以是Linux本身的实用程序,如ls和rm;也可以是购买的商业程序,如xv;或者是自由软件,如 emacs)。然后 shell 在搜索路径里寻找这些应用程序(搜索路径就是一个能找到可执行程序的目录列表)。如果输入的命令不是一个内部命令且在路径里没有找到这个可执行文件,将会显示一条错误信息。如果能找到命令,该内部命令或应用程序分解后将被系统调用并传给Linux内核。
shell的另一个重要特性是它自身就是一个解释型的程序设计语言,shell程序设计语言支持绝大多数在高级语言中能见到的程序元素,如函数、变量、数组和程序控制结构。shell编程语言简单易学,任何能在提示符中输入的命令都能放到一个可执行的shell程序中。
当普通用户登录成功后,系统将执行shell程序。正是shell程序提供了命令行提示符。作为默认值(Turbo Linux系统默认的shell是bash),普通用户用“$”作为提示符,超级用户(root)用“#”作为提示符。一旦出现了shell提示符,就可以输入命令名称及命令所需要的参数。shell将执行这些命令。如果一条命令花费了很长的时间来运行,或者在屏幕上产生了大量的输出,可在键盘上按Ctrl+C发出中断信号来中断它(在正常结束之前,中止它的执行)。
当用户准备结束登录对话进程时,可以输入logout命令、exit命令的名称或文件结束符(EOF)(按组合键Ctrl+D实现),结束登录。
1.1.2 shell的种类
Linux中的shell有多种类型,其中最常用的是Bourne shell(sh)、C shell(csh)和Korn shell(ksh),三种shell各有优缺点。Bourne shell是UNIX最初使用的shell类型,并且在每种UNIX上都可以使用。Bourne shell在shell编程方面相当优秀,但在处理与用户交互的方面做得不如其他几种shell。Linux操作系统默认的shell是Bourne Again shell,它是Bourne shell的扩展,简称bash,与Bourne shell完全兼容,并且在Bourne shell的基础上增加了很多特性。bash放在/bin/bash中有许多特色,可以提供如命令补全、命令编辑和命令历史表等功能,它还包含了很多C shell和Korn shell中的优点,有灵活和强大的编程接口,同时又有很友好的用户界面。
C shell是一种比Bourne shell更适于编程的shell,它的语法与C语言很相似。Linux为喜欢使用C shell的人提供了Tcsh。Tcsh是C shell的一个扩展版本。Tcsh包括命令行编辑、可编程单词补全、拼写校正、历史命令替换、作业控制和类似C语言的语法,它不仅和bash是提示符兼容,而且还提供比bash更多的提示符参数。
Korn shell集合了C shell和Bourne shell的优点,并且和Bourne shell完全兼容。Linux系统提供了 pdksh(ksh 的扩展),它支持任务控制,可以在命令行上挂起、后台执行、唤醒或终止程序。
Linux并没有冷落其他shell用户,它还包括了一些流行的shell,如ash、zsh等。每个shell都有它的用途,有些shell是有专利的,有些能从互联网上或其他渠道获得。要决定使用哪个shell,读一下各种shell的联机帮助即可。
1.2 shell控制台基本操作
在Linux命令中首先接触到的一个名词是“控制台(console)”,它就是我们通常见到的使用字符操作界面的人机接口,例如DOS。我们说控制台命令,就是指通过字符界面输入的可以操作系统的命令,例如DOS命令就是控制台命令。我们现在要了解的是基于Linux操作系统的基本控制台命令。有一点一定要注意,和DOS命令不同的是,Linux的命令(也包括文件名等)对大小写是敏感的,也就是说,如果你输入的命令大小写不对,系统就不会做出你期望的响应。
控制台实际上是一个可以编辑的文本缓冲区,在按回车键之前,可以对输入的文本进行编辑。比如利用Backspace键可以删除刚输入的字符,也可删除整行字符,还可以插入字符,使得用户在输入命令尤其是复杂命令时,若出现输入错误,无须重新输入整个命令,只要利用编辑操作,即可改正错误。
1.2.1 一些有用的技巧
命令行(或者说控制台)下有一些很有用的技巧,它们给用户带来很大的方便,这里仅列举几条常用的,供读者参考。
1.上、下箭头(↑↓)
利用上箭头可以重新显示刚执行的命令,这一功能可以重复执行以前执行过的命令,而无须重新输入该命令。
bash保存着以前输入过的命令的列表,这一列表被称为命令历史表。按上箭头,便可以在命令行上逐次显示各条命令。同样,按下箭头可以在命令列表中向下移动,这样可以将以前的各条命令显示在命令行上,用户可以修改并执行这些命令。
2.通配符(wildcards)
使用文件名匹配时不必一一写出名称,就可以指定多个文件,使用的这些特殊的字符,称为通配符(wildcards)。
例如,想用“rm”命令删除目录下所有以字符串“.bak”为结尾的文件,除了在“rm”后用所有文件名作为参数之外,还可以使用通配符“*”:
rm *.bak
“*”可匹配一个或多个字符。在本例中,该命令告诉shell将命令“rm”的参数扩展到所有以“*.bak”结尾的文件,shell 就将扩展后的参数告诉“rm”命令。
通配符在Linux命令中使用相当普遍,以后读者就会体会到。
3.重定向符(Redirection Operators)
有时,用户希望将命令的输出结果保存到文件中,或以文件内容作为命令的参数,这可以通过“>”和“<”来实现。
command > file
将command的输出结果保存到file中,以上操作将覆盖file中的内容。
ls > outfile
上面这条命令,将当前目录的内容保存到“outfile”文件。而如果想将 file 内容作为command的输入结果,可以使用如下命令:
command < file
另一种操作符是“>>”,是将输出结果添加到已存在的文件中,而不是覆盖原文件:
echo "string" >> file
上面命令的意思是,将string加到文件file中,这是一种不打开文件而完成编辑的好办法。
掌握重定向符对于我们使用 Linux 命令很有帮助,用户在以后的使用过程中会慢慢体会到。
1.2.2 模式切换
Linux 中有时需要不同模式之间的切换,此时就要用到以下这些命令。需要说明的是,这里我们做一些简单的介绍,有兴趣的读者可以参考本书中的相关命令的章节,尽管这些操作很简单,但是对于初学者来讲,熟悉它们,将对掌握和使用Linux非常有帮助。
● 由字符到图形:startx或init 5。
● 由图形到字符:logout或init 3。
● 注销:logout或exit或Ctrl+D。
● 关机:poweroff或init 0或shutdown now或 halt –p。
● 重启:reboot或init 6或shutdown -r now。
1.2.3 获取帮助
Linux 控制台下,“help”命令能提供一些内部命令的帮助,“man”或“info”能提供外部命令的帮助。
其实,如果用户的英文足够好而且会用 man,那完全可以不靠任何人就能精通 Linux。man实际上就是查看指令用法的help,学习任何一种UNIX类的操作系统(如Linux),最重要的就是学会使用man这个辅助命令。man是manual(手册)的缩写,关于它的说明非常详细,因此,建议读者多学习man的用法。
关于Linux命令的基础知识已介绍完毕,本书是一本以介绍命令为主的图书,因此,从下一章开始,将重点介绍各个命令的使用方法及使用实例。