2.5 Linux的用户接口与文本编辑器
2.5.1 shell简介
严格地说,Linux这个名字仅仅指的是由Linus主导发展的一个操作系统内核,而不是一般用户所看到和使用的操作系统平台。但由于Linux内核得到了广泛使用和宣传,现在一般所指的Linux包括了操作系统内核和由GNU提供的一系列外围程序。它们组成了能够提供计算机硬件管理和执行用户操作请求功能的操作系统平台。这个系统在结构上可以划分为4部分,如图2-28所示。
图2-28 系统结构
1.Linux内核
内核是系统的心脏,是运行程序和管理磁盘、打印机等硬件设备的核心程序。
2.运行期库和系统程序
在内核以外,就是一组运行期库和系统程序,它们封装了内核向外提供的功能接口,将这些功能加入一定的权限检查后,通过自己的应用接口提供给一般用户进程使用。
3.shell
shell是系统的用户界面,提供了用户与内核进行交互操作的一种接口。它接收用户输入的命令,并且把它送入内核去执行。
4.实用工具程序
实用工具程序是用户用来完成其特定工作的应用程序。标准的Linux系统包括了一套实用工具程序,如文本编辑器、数据处理工具、开发工具、Internet工具等。用户也可以遵照Linux的规则开发自己的应用程序。
Red Hat Linux包括几种不同的shell。Bash是为互动用户提供的默认shell。
2.5.2 shell命令基础
在文本界面下,用户对Linux的操作通过shell命令来实现。shell可执行的用户命令分为内置命令和实用程序两大类。
shell对于用户输入的命令,有以下几种处理方式:
1)如果用户输入的是内置命令,那么由shell的内部解释器进行解释,并交由内核执行。
2)如果用户输入的是实用程序命令,而且给出了命令的路径,那么shell会按照用户提供的路径执行命令。
用户登录到Linux系统时,可以看到一个shell提示符(如果以root用户登录,获得的提示符是“#”,普通用户将是“$”),标识了命令行的开始。用户可以在提示符后面输入任何命令及参数,如图2-29所示。
图2-29 date命令
用户登录时,实际进入了shell,它遵循一定的语法将输入的命令加以解释并传给系统。命令行中输入的第一个字段必须是一个命令的名字,第二个字段是命令的选项或参数,命令行中的每个字段必须由空格或制表符(按〈Tab〉键)隔开,具体格式如下:
选项是包括一个或多个字母的代码,它前面有一个减号(减号是必要的,Linux用它来区别选项和参数),选项可用于改变命令执行的动作的类型,如图2-30所示。
图2-30 没带选项的ls命令
这是没有选项的ls命令,可列出当前目录中的所有文件,只列出各个文件的名字,而不显示其他更多的信息。
加入“-l”选项,将会为每个文件列出一行信息,诸如数据大小和数据最后被修改的时间,如图2-31所示。
图2-31 带选项的ls命令
这里要特别注意,Linux的命令是区分大小写的。在命令行(shell)中,可以使用〈Tab〉键来自动补齐全命令,即可以输入命令的前几个字母,然后按〈Tab〉键,系统将自动补全该命令。若不止一个,则显示所有和输入字符相匹配的命令。
另外,利用向上或向下的方向键,可以翻查曾执行过的历史命令,并可再次执行。
要在一个命令行上输入和执行多条命令,可使用分号来分隔命令,比如,“cd /etc;ls -l”。
断开一个长命令行,可使用反斜杠“\ ”将一个较长的命令分为多行表达,以增强命令的可读性。换行后,shell自动显示提示符“>”,表示正在输入一个长命令,此时可继续在新行上输入命令的后续部分。
通配符用于模式匹配,如文件名匹配、路径名搜索、字符串查找等。常用的通配符有“*”“?”和括在方括号“[]”中的字符序列。用户可以在作为命令参数的文件名中包含这些通配符,构成一个所谓的“模式串”,在执行过程中进行模式匹配。
1)*代表任何字符串(长度可以不等)。例如,“f*”匹配以f打头的任意字符串。但应注意,文件名前的圆点(.)和路径名中的斜线(/)必须显式匹配。例如,“*”不能匹配.file,而“.*”才可以匹配.file。
2)?代表任何单个字符。
3)[]代表指定的一个字符范围,只要文件名中[]位置处的字符在[]中指定的范围之内,那么这个文件名就与这个模式串匹配。方括号中的字符范围可以由直接给出的字符组成,也可以由表示限定范围的起始字符、终止字符及中间的连字符(-)组成。例如,f[a-d]与f[abcd]的作用相同。shell将把与命令行中指定的模式串相匹配的所有文件名都作为命令的参数,形成最终的命令,然后再执行这个命令。
2.5.3 基本命令
shell命令非常多,选项也非常复杂,不易全部掌握。本书选择性地介绍最常用的shell命令。
1.与文件、目录的建立以及路径相关的shell命令
(1)mkdir命令
功能:创建一个目录(类似DOS下的md命令)。
语法:
说明:该命令创建由dir-name命名的目录。要求创建目录的用户在当前目录(dir-name的父目录)中具有写权限,并且dir-name不能是当前目录中已有的目录或文件名称。
命令中各选项的含义如下:
● -m为对新建目录设置存取权限,也可以用chmod命令设置;
● -p为可以是一个路径名称,此时若路径中的某些目录尚不存在,加上此选项后,系统将自动建立好那些尚不存在的目录,即一次可以建立多个目录。
【例2-1】 创建名为test的目录,并在其下创建aa/bb/cc/dd目录。
过程及结果如图2-32所示。
图2-32 建立目录
在例2-1中可以看到,没有选项-p是无法直接递归建立多个目录的。
(2)rmdir命令
功能:删除空目录。
语法:
说明:dir-name表示目录名。该命令从一个目录中删除一个或多个子目录项。需要特别注意的是,一个目录被删除之前必须是空的。rm -r dir命令可代替rmdir,但是有危险性。删除某目录时也必须具有对父目录的写权限。
命令中选项的含义如下:
-p为递归删除目录dir-name,当子目录删除后其父目录为空时,父目录也一同被删除。如果整个路径被删除或者由于某种原因保留部分路径,则系统在标准输出上显示相应的信息。例如,删除例2-1中的test目录:
(3)pwd命令
功能:显示整个路径名。
语法:
说明:此命令显示出当前工作目录的绝对路径。在Linux层次目录结构中,用户可以在被授权的任意目录下利用mkdir命令创建新目录,也可以利用cd命令从一个目录转换到另一个目录。然而,没有提示符来告知用户目前处于哪一个目录中。要想知道当前所处的目录,可以使用pwd命令。
(4)cd命令
功能:改变工作目录。
语法:
说明:该命令将当前目录改变至directory所指定的目录。若没有指定directory,则回到用户的主目录。为了进入指定目录,用户必须拥有对指定目录的执行和读权限。
【例2-2】 切换目录。
如图2-33所示,利用cd命令切换到/var目录,然后切换到spool目录下。
图2-33 切换目录
这里路径既可采用绝对路径,也可采用相对路径。当采用相对路径时,是指切换到当前目录中的某个子目录。
【例2-3】 切换到用户主目录。
如图2-34所示,“cd~”命令和“cd ”命令作用相同,都能切换到用户的主目录。默认情况下,超级用户的主目录是/root,而普通用户的主目录是/home下与该用户同名的子目录。
图2-34 切换到用户主目录
(5)ls命令
功能:ls是英文单词list的简写,其功能为列出目录的内容。这是用户最常用的命令之一,因为用户需要不时地查看某个目录的内容。该命令类似于DOS下的dir命令。
语法:
说明:对于每个目录,该命令将列出其中的所有子目录与文件。对于每个文件,ls将输出其文件名以及所要求的其他信息。默认情况下,输出条目按字母顺序排序。当未给出目录名或文件名时,就显示当前目录的信息。
命令中常用选项的含义如下:
● -a为显示指定目录下所有子目录与文件,包括隐藏文件;
● -A为显示指定目录下所有子目录与文件,包括隐藏文件,但不列出“.”和“..”;
● -C为分成多列显示各项;
● -l为以长格式来显示文件的详细信息,这个选项最常用;
● -d为如果参数是目录,只显示其名称而不显示其下的各文件,往往与l选项一起使用,以得到目录的详细信息;
● -i为在输出的第一列显示文件的i结点号。每行列出的信息依次是:文件类型与权限链接数 文件属主 文件属组 文件大小 建立或最近修改的时间 名字。对于符号链接文件,显示的文件名之后有“->”和引用文件路径名。对于设备文件,其“文件大小”字段显示主、次设备号,而不是文件大小。目录中的总块数显示在长格式列表的开头,其中包含间接块。
● -m为输出按字符流格式,文件跨页显示,以逗号分开;
● -n为输出格式与l选项相同,只不过在输出中文件属主和属组是用相应的UID号和GID号来表示,而不是实际的名称;
● -R为递归式地显示指定目录的各个子目录中的文件;
● -t为显示时按修改时间(最近优先)而不是按名字排序。若文件修改时间相同,则按字典顺序。默认的时间标记是最后一次修改时间。
【例2-4】 查看当前目录下所有文件和子目录的详细信息。
/var/spool下所有文件和子目录的详细信息如图2-35所示。
图2-35 显示/var/spool下所有文件和子目录的详细信息
2.与Linux文件的复制、删除和移动命令有关的命令
(1)cp命令
功能:将给出的文件或目录复制到另一文件或目录中。该命令同DOS下的copy命令一样,功能十分强大。
语法:
说明:该命令把指定的源文件复制到目标文件或把多个源文件复制到目标目录中。
该命令的主要选项含义如下:
● -d为复制时保留链接。
● -r为若给出的源文件是一个目录文件,此时cp将递归复制该目录下所有的子目录和文件。此时目标文件必须为一个目录名。
【例2-5】 复制命令的使用。
(2)mv命令
功能:为文件或目录改名或将文件由一个目录移入另一个目录中。
语法:
说明:视mv命令中第二个参数类型的不同(是目标文件还是目标目录),mv命令将文件重命名或将其移至一个新的目录中。当第二个参数类型是文件时,mv命令完成文件重命名,此时,源文件只能有一个(也可以是源目录名),它将所给的源文件或目录重命名为给定的目标文件名。当第二个参数是已存在的目录名称时,源文件或目录参数可以有多个,mv命令将各参数指定的源文件均移至目标目录中。在跨文件系统移动文件时,mv命令先复制,再将原有文件删除,而链至该文件的链接也将丢失。
命令中主要选项的含义如下:
● -i为交互方式操作,如果mv操作将导致对已存在的目标文件的覆盖,此时系统询问是否重写,要求用户回答y或n,这样可以避免误覆盖文件;
● -f为禁止交互操作,在mv操作要覆盖某已有的目标文件时不给任何指示,指定此选项后,i选项将不再起作用。
如果所给目标文件(不是目录)已存在,此时该文件的内容将被新文件覆盖。为防止用户用mv命令破坏另一个文件,使用mv命令移动文件时,最好使用i选项。
【例2-6】 mv命令的使用。
(3)rm命令
功能:用户可以用rm命令删除不需要的文件。该命令的功能为删除一个目录中的一个或多个文件或目录,它也可以将某个目录及其下的所有文件及子目录均删除。对于链接文件,只是断开了链接,原文件保持不变。
语法:
说明:如果没有使用-r选项,则rm不会删除目录。
该命令的各选项含义如下:
● -f为忽略不存在的文件,从不给出提示;
● -r指示rm将参数中列出的全部目录和子目录均递归地删除;
● -i进行交互式删除。
使用rm命令要小心。因为一旦文件被删除,它是不能被恢复的。要防止这种情况的发生,可以使用i选项来逐个确认要删除的文件。如果用户输入y,文件将被删除。如果输入任何其他东西,文件则不会被删除。
【例2-7】 rm命令的使用。
(4)touch命令
功能:touch命令用于更新指定的文件或目录被访问和修改时间为当前系统的日期和时间。查看当前系统日期和时间,使用date命令。
若指定的文件不存在,则该命令将以指定的文件名自动创建出一个空文件。这也是快速创建文件的一个途径。
【例2-8】 要创建两个没有内容的空文件aa和bb。
注意,touch命令和文件名,以及各个文件名之间用空格进行分隔,如图2-36所示。
图2-36 touch命令的使用
3.与查看文件内容有关的命令
(1)cat命令
语法:
说明:cat命令是最简单的查看命令,它可以显示文本文件的内容,常用这个命令来显示较小的文件,比如只有几行或者最多不超过一屏的文件,原因是这个命令会不受控制地把整个大文件一下显示完。所以如果用它来阅读大文件,只能看到最后一屏的文本。
该命令的各选项含义如下:
● -n选项用来在每行前面显示行号;
● -b选项跟-n选项作用差不多,都用来显示行号,但-b只会在非空白行显示行号。
在cat命令后面可以指定多个文件,或使用通配符实现依次显示多个文件的内容,比如:
【例2-9】 查看/etc/fstab文件的内容,并在每一行前加行号。
显示/etc/fstab的内容如图2-37所示。
图2-37 显示/etc/fstab的内容
(2)more命令
语法:
说明:more命令也常用来显示较长的文本文件,不过它只能向文件后面翻页。它也有些控制键,按〈h〉键可以查看帮助。
该命令的选项含义如下:
-s表示压缩多行空白为单行空白。
(3)less命令
语法:
说明:less命令常用来显示较长的文本文件,它可以向前向后翻页。这个命令有很多控制快捷键,如按键盘上的空格键可以向下翻一页,按〈Enter〉键翻一行,按字母〈b〉键回到前一页。这个命令还可以查找文本,比如,输入“/abc”按〈Enter〉键就可以向文件的后面搜索abc这串文本,输入“?abc”则向文件的前面搜索abc。
该命令的各选项含义如下:
● -N表示显示行号。
● -s表示压缩多行空白为单行空白。
(4)head命令
语法:
说明:head命令默认情况下显示文件的前10行。
该命令的选项含义如下:
-Number显示文件前面Number行,如head -5 myfile将显示文件的前5行;
-c Number这个选项用来显示文件前面Number个字符。
【例2-10】 显示/etc/fstab文件的前5行内容,如图2-38所示。
图2-38 显示/etc/fstab前5行的内容
【例2-11】 显示/etc/fstab文件的前5个字符。
显示etc/fstab的前5个字符如图2-39所示。
图2-39 显示/etc/fstab的前5个字符
(5)tail命令
语法:
说明:tail命令默认情况下显示文件的最后10行。
该命令的各选项含义如下:
● -Number显示文件最后Number行,如head -5 myfile将显示文件的最后5行。
● +Number显示文件的第Number+1行到最后一行。
● -c Number显示文件前面Number个字符。
(6)grep命令
语法:
说明:grep命令用于在指定的文件中,查找并显示含有指定字符串的行。
【例2-12】 在/etc/fstab文件中,查找显示含有swap的行的内容。
显示如图2-40所示。
图2-40 显示含有swap的行的内容
(7)>、>>与<、<<重定向操作符
Linux中通常通过键盘输入数据,而命令的执行结果和错误信息都输出到屏幕。也就是说,Linux的标准输入是键盘,标准输出和标准错误输出是屏幕。
shell中不使用系统的标准输入、标准输出或标准错误输出端口,重新进行指定的情况称为输入/输出重定向。
>、>>与<、<<重定向操作符:输入信息到目标,或者从目标读取录入信息;>表示直接覆盖,而>>表示追加。
1)输入重定向。输入重定向是指把命令或可执行程序的标准输入重定向到指定的文件中。也就是说,输入可以不来自键盘,而来自一个指定的文件。所以说,输入重定向主要用于改变一个命令的输入源,特别是改变那些需要大量输入的输入源。例如,wc命令统计指定文档包含的行数、单词数和字符数。如果仅在命令行上输入:
wc命令将等待用户告诉它统计什么,这时shell就好像无效一样,从键盘输入的所有文本都出现在屏幕上,但并没有什么结果,直至按〈Ctrl+D〉组合键,wc才将命令结果显示在屏幕上。如果给出一个文档名作为wc命令的参数,wc命令将返回该文档所包含的行数、单词数和字符数。
显示如图2-41所示。
图2-41 wc命令
另一种把/etc/passwd文档内容传给wc命令的方法是重定向wc的输入。输入重定向的一般格式:
可以用下面的命令把wc命令的输入重定向为/etc/passwd文件:
结果如图2-42所示。
图2-42 wc命令的输入重定向为/etc/passwd文件
另一种输入重定向称为here文档,它告诉shell当前命令的标准输入来自命令行。here文档的重定向操作符使用<<。它将一对分隔符号(分隔符号是由<<符号后的单词来定义的,本例中用eof来表示)之间的正文作为标准输入定向给命令。
【例2-13】 将一对分隔符号ok之间的正文作为wc命令的输入,如图2-43所示,统计出正文的行数、单词数和字符数。
图2-43 ok之间的正文作为wc命令的输入
在<<操作符后面,任何字符或单词都可以作为正文开始前的分隔符号,本例中使用ok作为分隔符号。here文档的正文一直延续到遇见另一个分隔符号为止。第二个分隔符号应出现在新行的开头。这时here文档的正文(不包括开始和结束的分隔符号)将重新定向送给wc命令作为它的标准输入。
2)输出重定向。输出重定向能实现将一个命令的输出重定向到一个文件中,而不是显示到屏幕上。例如,要将date命令的输出结果传输到abc.txt文件中,则实现命令:
结果如图2-44所示。
图2-44 输出重定向
重定向符经常与cat命令结合使用,从而实现文件的创建与合并等操作。
【例2-14】 将file1.txt和file2.txt的内容合并,并将合并后的内容传输给file3.txt文件保存。
如果file3.txt文件中有内容不想被覆盖,则可使用命令:
表示将file1.txt和file2.txt的内容追加到file3.txt文件中。
(8)管道命令
利用Linux所提供的管道符“| ”将两个命令隔开,管道符左边命令的输出就会作为管道符右边命令的输入。连续使用管道意味着第一个命令的输出会作为第二个命令的输入,第二个命令的输出又会作为第三个命令的输入,依此类推。
【例2-15】 利用一个管道命令实现查找是否已经安装了FTP服务器软件。
显示如图2-45所示,已经安装。
图2-45 利用管道命令查询是否已经安装FTP软件
【例2-16】 利用多个管道。
这条命令使用了两个管道,利用第一个管道将cat命令(显示passwd文件的内容)的输出送给grep命令,grep命令找出含有“/bin/bash”的所有行;第二个管道将grep的输入送给wc命令,wc命令统计出输入中的行数。这个命令的功能在于找出系统中有多少个用户使用bash。结果如图2-46所示。
图2-46 利用多个管道
4.获得帮助的命令
用户可以通过下述3种方法获得帮助。
(1)--help命令
语法:命令名--help
说明:大多数命令都可以通过--help命令获取自身提供的帮助。
【例2-17】 查看cat命令的帮助信息。
结果如图2-47所示。
图2-47 用--help命令查看cat命令的帮助信息
(2)man命令
语法:man命令名
说明:用户可以通过man命令来查看任何命令的联机帮助信息。它将命令名作为参数。
【例2-18】 查看cat命令的帮助信息。
结果如图2-48所示。
图2-48 man查询命令的用法
(3)在线帮助文档
还可以通过一些专业网站或者搜索引擎获得帮助。
5.其他shell命令
(1)clear命令
语法:clear
说明:清除当前终端的屏幕显示。
(2)uname命令
语法:uname -r或uname -a命令
说明:查看Linux内核版本。
2.5.4 文本编辑器简介
文本编辑器是所有计算机系统中最常使用的一种工具。用户在使用计算机时,往往需要建立自己的文件,无论是一般的文本文件、数据文件还是编写的源程序文件,这些工作都离不开编辑器。
Linux系统提供了一个完整的编辑器家族系列,如Ed、Ex、Vi和Emacs等。按功能可以将编辑器分为两大类:行编辑器(Ed、Ex)和全屏幕编辑器(Vi、Emacs)。行编辑器每次只能对一行进行操作,使用起来很不方便。而全屏幕编辑器可以对整个屏幕进行编辑,用户编辑的文件直接显示在屏幕上,修改的结果可以立即看出来,克服了行编辑的那种不直观的操作方式,便于用户学习和使用,具有强大的功能。
Vi是Linux系统的第一个全屏幕交互式编辑程序,它从诞生至今一直得到广大用户的青睐,历经数十年仍然是人们使用的主要文本编辑工具,足见其生命力之强,而强大的生命力是其强大的功能带来的。
2.5.5 Vi简介
Vi是“Visual interface”的简称,它在Linux上的地位就仿佛Edit程序在DOS上一样。它可以执行输出、删除、查找、替换、块操作等众多文本操作,而且用户可以根据自己的需要对其进行定制,这是其他编辑程序所没有的。
Vi不是一个排版程序,它不像Word或WPS那样可以对字体、格式、段落等其他属性进行编排,它只是一个文本编辑程序。
Vi没有菜单,只有命令,且命令繁多。Vi有3种基本工作模式:命令行模式、文本输入模式和末行模式。
1.命令行模式
任何时候,不管用户处于何种模式,只要按一下键,即可使Vi进入命令行模式;在shell环境(提示符为$)下输入启动Vi命令,进入编辑器时,也处于该模式下。
在该模式下,用户可以输入各种合法的Vi命令,用于管理自己的文档。此时从键盘上输入的任何字符都被当作编辑命令来解释。若输入的字符是合法的Vi命令,则Vi在接受用户命令之后完成相应的动作。但需要注意的是,所输入的命令并不在屏幕上显示出来。若输入的字符不是Vi的合法命令,Vi会响铃报警。
2.文本输入模式
在命令行模式下输入插入命令i、附加命令a、打开命令o、修改命令c、取代命令r或替换命令s都可以进入文本输入模式。在该模式下,用户输入的任何字符都被Vi当作文件内容保存起来,并将其显示在屏幕上。在文本输入过程中,若想回到命令行模式下,按键即可。
3.末行模式
在命令行模式中,用户按〈:〉键即可进入末行模式。此时,Vi会在显示窗口的最后一行显示一个“:”作为末行模式提示符,等待用户输入命令。末行命令执行完后,Vi自动回到命令行模式。
3种工作模式的转换如图2-49所示。
图2-49 Vi编辑器的3种工作模式
2.5.6 Vi的基本命令
1.Vi的进入
用户登录到系统中之后,系统给出提示符“$”。在提示符后输入Vi“文件名”,便可进入Vi。如果不指定文件,则新建一个文本文件,退出Vi时必须指定文件。
进入Vi后,屏幕左方会出现波浪号,如果行首有该符号,就代表此行目前是空的。如果没有输入文件名,则会打开一个空文件,并显示Vim的简单帮助信息,如图2-50所示。
图2-50 Vi打开一个空文件
如果打开的是已经存在的文件,则会在编辑窗口最后一栏显示这个文件的相关信息和光标的位置,如图2-51所示。
图2-51 Vi状态信息栏
Vi的最后一行显示打开的文件名为“/etc/passwd”,总共46行,2023个字符。
2.在Vi中添加文本
在Vi中添加文本的命令见表2-4。
表2-4 在Vi中添加文本的命令
3.在Vi中删除文本
在Vi中删除文本见表2-5。
表2-5 在Vi中删除文本
4.在Vi中查找、替换与复制
在Vi中查找、替换与复制见表2-6。
表2-6 在Vi查找、替换与复制
5.在Vi中撤销与重复
在Vi中撤销与重复见表2-7。
表2-7 在Vi撤销与重复
6.退出Vi及保存文件
退出Vi及保存文件见表2-8。
表2-8 退出Vi及保存文件
7.滚动查看文本
滚动查看文本见表2-9。
表2-9 滚动查看文本