第2章 初试Shell
操作系统的核心功能就是管理和控制计算机硬件、软件资源,以尽量合理、有效的方法组织多个用户共享多种资源,而Shell则是介于使用者和操作系统核心程序(Kernel)间的一个接口。在各种Linux发行套件中,目前虽然已经提供了丰富的图形化接口,但是Shell仍旧是一种非常方便、灵活的途径。
2.1 启动Shell
Linux中的Shell又被称为命令行,在这个命令行窗口中,用户输入指令,操作系统执行并将结果回显在屏幕上,如图2-1所示。
图2-1 Red Hat Enterprise Linux中的命令行
2.1.1 使用终端窗口
现在的Red Hat Enterprise Linux 5操作系统,默认采用的都是图形界面的GNOME或者KDE操作方式,要想使用Shell功能,就必须像在Windows中那样打开一个命令行窗口。一般用户,可以执行“应用程序”→“附件”→“终端”来打开终端窗口(或者直接右键单击桌面,选择“终端”命令),如图2-2所示。
图2-2 Red Hat Enterprise Linux 5从这里打开终端窗口
执行以上命令后,就打开了一个白底黑字的命令行窗口,如图2-3所示,在这里我们可以使用Red Hat Enterprise Linux 5支持的所有命令行指令。
图2-3 命令行——终端窗口
2.1.2 使用Shell提示符
在Red Hat Enterprise Linux 5中,还可以更方便地直接打开纯命令行窗口。应该怎么操作呢?看过第1章关于Linux启动过程的用户应该了解到,在启动的最后,它定义了6个虚拟终端,可以供用户随时切换,切换时用“Ctrl”+“Alt”+“F1”~“Ctrl+Alt+F6”组合键可以打开其中任意一个。不过,此时就需要重新登录了,如图2-4所示。
图2-4 使用“Ctrl+Alt+F1”组合键打开的终端1
小提示
进入纯命令行窗口之后,还可以使用“Alt+F1”~“Alt+F6”组合键在6个终端之间切换,每个终端可以执行不同的指令,进行不一样的操作。登录之后,普通用户的命令行提示符以“$”号结尾,超级用户则以“#”号结尾。
[clinuxer@localhost ~]$ ;一般用户以“$”号结尾
[clinuxer@localhost ~]$su root ;切换到root账号
Password:
[root@localhost clinuxer]# ;命令行提示符变成以“#”号结尾了
当用户需要返回图形桌面环境时,也只需要按下“Ctrl+Alt+F7”组合键,就可以返回到刚才切换出来的桌面环境。
也许有的用户想让Red Hat Enterprise Linux 5启动后就直接进入纯命令行窗口,而不是打开图形界面,这也很简单,使用任何文本编辑器打开/etc/inittab文件,找到如图2-5所示的行:
图2-5 让Red Hat Enterprise Linux 5启动到命令行模式
id:5:initdefault:
将它修改为:
id:3:initdefault
重新启动系统你就会发现,它登录的是命令行,而不是图形界面。
小提示
要想让Red Hat Enterprise Linux 5直接启动到图形界面,可以按照上述操作将“id:3”中的“3”修改为“5”;也可以在纯命令行模式,直接执行“startx”命令打开图形模式。
2.2 Linux Shell大家族
各种操作系统都有自己的Shell,比如DOS/Windows95/Windows98的Shell是Command.com, WindowsNT/2000/XP/2003/Vista是Cmd.exe, Red Hat Enterprise Linux 5默认的Shell是Bash。
2.2.1 LinuxShell家族史
目前,在主要的Linux/UNIX系统中,有3种最有名且被广泛支持的Shell,它们分别是:Bourne Shell(A&T Shell,又被简称为sh, Linux下有增强版的Bash)、C Shell(Berkeley Shell, Linux下有增强版的tcsh)和Korn Shell(Bourne Shell的超集)。
1.Bourne Shell
Bourne Shell是标准的UNIX/Linux Shell,常被用来作为系统管理工具。我们平时接触到的绝大部分系统管理指令,比如rc start、stop和shutdown都是它的内置命令。它由AT&T贝尔实验室的Stevphen Bourne于1978年前后编写完毕,并随UNIX Version 7一起发布。Bourne Shell以简洁、快速著名,默认提示符为$。
2.C Shell
C Shell是由Berkeley(伯克利)大学的Bill Joy研发的,加入了一些早期Bourne Shell所不具备的特性,比如命令行记录、别名、命令行自动完成和作业控制,它于1979年随BSD操作系统首次发布。
虽然不少用户喜欢在系统管理时使用Bourne Shell,但在交互模式下,还是C Shell比较受欢迎。
3.Korn Shell
Korn Shell是Bourne Shell的超集,由AT&T的David Korn开发。它新增加了一些特性,这让它看起来比C Shell更为出色,现在Shell所支持的绝大多数功能,比如历史记录、别名、函数、正规表达式、内置算术支持和作业控制等,它都完美支持。
值得一提的是,Bourne Shell和Korn Shell几乎完全向上兼容,在Bourne Shell下开发的程序,甚至可以不用修改就可以拿来在Korn Shell下运行。
2.2.2 使用Bash Shell
Bash是Bourne Again Shell的缩写,它是由自由软件基金会的Brian Fox在1987年开发的,之后得到了Case Western Reserve大学Chet Ramey的进一步发展。Bash包括了早期Bourne Shell和Korn Shell的所有功能,并且加入了C Shell的某些功能。
现在无论使用的是哪种操作系统,默认的Shell总是Bash。如果你不确定自己使用的是哪种Shell,可以使用以下指令来加以分辨:
[root@localhost ~]#echo $SHELL ;查看SHELL变量的值
/bin/bash ;说明使用的是Bash Shell
[root@localhost ~]#
2.2.3 使用其他Shell
虽然Red Hat Enterprise Linux 5默认采用的是Bash Shell,不过也有用户喜欢其他的Shell,比如有些程序编写人员就更喜欢结构化的tcsh Shell,因为它的语法结构更像编程语言。
1.暂时使用其他Shell
要打开其他Shell,也很简单,因为Red Hat Enterprise Linux 5内置的就有tcsh、ash和zsh等Shell,我们只要在命令行下输入相应Shell的名字执行它就可以了。
对于不知道Red Hat Enterprise Linux 5内置有哪些Shell的朋友,可以通过查看/etc/shells文件来了解:
[root@localhost ~]#cat /etc/shells
;查看shells文件的内容
所有Shell的列表,如图2-6所示。
图2-6 查看Red Hat Enterprise Linux 5包括的Shell
小提示
还有一个小指令可以直接查看本地Linux系统中包括了哪几种Shell,这个小指令是chsh。它的列表显示本地Shell命令行语法如下:
[root@localhost ~]# chsh --list
2.永远使用其他Shell
如果不喜欢默认的Shell,则只需输入暂时想要使用的Shell名字即可使用该Shell。要想永久地更改Shell,则可以使用chsh命令。例如,为用户clinuxer将Shell改为tcsh Shell,作为根用户可以在Shell中输入以下命令,如图2-7所示。
图2-7 永远修改用户Shell
[root@localhost ~]# chsh -s /bin/tcsh clinuxer
2.3 探索Shell
现在虽然各种Linux发行套件默认启动的都是图形界面,但命令行仍然是不可替代的,这不但因为很多管理必须通过命令行来完成,而且因为命令行操作更快捷、灵活。
2.3.1 目录及文件管理命令
Linux中与大家关系最为密切,并且使用最广泛的命令莫过于文件和目录管理命令。
1.拷贝文件——cp
Linux中用来拷贝文件的cp命令,有相当多的参数。在默认配置下,该命令在工作时不会提示任何信息,只有在出现错误时才会告知用户。下面是常见的cp命令参数:
cp [-fI] FileName TargetFileName
➢ -f,强制拷贝。即使是覆盖文件也不会提示。
➢ -I,交互式拷贝。在拷贝每一个文件之前,都要提醒用户确认。
【实例】
拷贝index.htm为index.html:
[root@localhost ~]#cp index.htm index.html
将当前目录下的所有.c文件拷贝到/home/clinuxer下:
[root@localhost ~]#cp *.c /home/clinuxer
2.移动文件——mv
mv命令用来将文件从一个位置移动到另外一个位置。需要注意的是,在不同分区之间的移动会先拷贝,再移动,所以花费时间要长一些。mv命令的常用参数如下:
mv [-fI] FileName
➢ -f,强制移动。
➢ -I,交互式移动。
【实例】
将/home/clinuxer下的所有文件移动到/tmp目录下:
[root@localhost ~]#mv /home/clinuxer/* /tmp
如果mv命令前后指定的文件都在同一目录下,但名字不同,则起到的作用是重命名:
[root@localhost ~]#mv /home/clinuxer/a.c /home/clinuxer/b.c
3.文件和目录列表——ls
DOS/Windows下的dir命令在Linux下对应的是ls命令,只不过后者的参数更多而已。ls命令的主要参数如下:
ls [-alrhi] [DirectoryName]
➢ -a,显示所有文件和目录。
➢ -l,显示详细信息,包括权限、拥有者、群组、大小、创建日期,以及是否链接文件等。
➢ -r,递归显示指定目录和它下面子目录中的所有内容。
➢ -h,将文件大小以更人性化的方式显示,比如1KB、256MB、4GB等。
➢ -i,显示索引信息(inode)。索引相同的两个文件是硬链接的关系。
【实例】
以更人性化的方式详细显示当前目录下文件(包括索引信息),如图2-8所示。
图2-8 ls命令详细显示当前目录下文件
[root@localhost ~]#ls -lih
小提示
要查看ls命令的详细帮助信息,请在命令行提示符下输入“man ls”,或者用“man ls —col -b — lpr”打印出来查看。
4.删除文件
Linux下的删除文件命令是rm,它的命令行参数如下:
rm [-ifvr] [FileName]
➢ -i,交互式删除。每次删除前都要确认。
➢ -f,强制删除。需要注意的是,Linux下文件被删除后很难恢复,所以执行本命令请时慎重。
➢ -v,冗余模式,显示更多的提示信息。
➢ -r,递归模式,不但删除指定内容,还删除它的子目录下的内容。
【实例】
删除FileName:
[root@localhost ~]#rm FileName
5.创建目录
Linux下的创建目录命令是mkdir,它的语法格式如下:
mkdir [-p ] DirName
【实例】
在当前目录下,创建一个foo目录:
[root@localhost ~]#mkdir foo
在当前目录下的foo目录下创建bar目录,如果foo目录不存在,就先创建一个(需要注意的是,如果不添加-p参数,则foo不存在时,会提示错误信息并创建失败):
[root@localhost ~]#mkdir -p foo/bar
6.删除目录
Linux下删除目录的命令是rmdir,不过带参数的rm命令本身也具备目录删除功能。rmdir命令的参数如下:
rmdir [-vp] Directory
➢ -v,冗余模式,显示更多的提示信息。
➢ -p,不但删除指定目录,还删除其上级目录。
【实例】
➢ 删除Directory目录:
[root@localhost ~]#rmdir /Directory/ [root@localhost ~]#rm -rf /Directory/
需要注意的是,rmdir命令仅当该目录为空时才执行删除操作,而用rm命令删除目录则会删除该目录和其目录中包括的所有内容。
➢ 删除/Directory/D1的同时删除其父目录/Directory:
[root@localhost ~]#rmdir -p /Directory/D1/
7.查看当前目录
在操作计算机时,你可能需要知道当前位于哪个目录。这个问题可以通过pwd命令来获得答案。这里还需要提示大家的是,不要被DOS下的cd命令显示当前目录所迷惑,Linux下执行cd命令将会直接切换到用户的家目录。
如果想知道当前所在的目录,请执行以下命令:
[root@localhost ~]#pwd
8.切换目录
要改变当前目录,需要用到cd命令,命令名与Windows下一样,使用方法也大同小异,只不过Linux下的cd命令功能更强大一些而已。
【实例】
[root@localhost ~]#cd ;切换到用户家目录 [root@localhost ~]#cd - ;返回到上一个目录 [root@localhost ~]#cd ~ ;同样是返回到家目录 [root@localhost ~]#cd / ;切换到根目录 [root@localhost ~]#cd /root ;切换到root用户的家目录 [root@localhost ~]#cd .. ;切换到上级目录 [root@localhost ~]#cd /home/clinuxer ;切换到clinuxer用户的家目录
9.查找文件或目录——find
你可能知道有这么一个目录或者文件存在,但就是不知道它到底在哪里?Linux下有几个可以帮助我们完成查找、搜索功能的工具,即find、locate和which等。
find的命令行格式如下:
find StartDir Options
如果用户没有指定路径,则find命令会从当前目录开始搜索并且搜遍所有的子目录。
find命令最常用的参数如下:
➢ -atime n,至少在n×24小时以内没有访问过的文件。
➢ -ctime n,至少在n×24小时以内没有修改过的文件。
➢ -amin n, n分钟之前访问过的文件。
➢ -ctime n, n分钟之前修改过的文件。
➢ -print,列表显示找到的文件。
➢ -name fname,文件的名字应为fname,这里可以使用正则表达式。
➢ -size n[bck],文件的长度至少为n块/字符/千字节(每块等于512字节)。
【实例】
➢ 寻找/tmp下至少7天没有被访问过的文件并显示:
[root@localhost ~]#find /tmp -atime 7 -print
➢ 找出/home/clinuxer下所有文件后缀为tmp的文件并且删除它们:
[root@localhost ~]#find /home/clinuxer -name "*.tmp" -exec rm
从上例中我们可以看到,find命令最强大之处在于可以和“exec”命令结合使用。需要注意的是,文件名会被传递给使用字符串“{}”的命令,并且命令的结尾以“\; ”结束。比如,我们要查找/usr/src/redhat目录下的所有文件,找到包含有“tcp”的并打印出来:
[root@localhost ~]#find /usr/src/redhat -name "*.*" -exec grep ' tcp' {}\; -print
10.查找文件或目录——locate
locate命令与find不同,它是通过在一个数据库中搜索文件或者目录(所以速度比find命令快多了,但如果没有更新数据库,也可能造成搜索结果错误)。
locate的命令行格式如下:
locate Something
11.查找文件或目录——which/whereis/whatis
Linux下还有which、whereis和whatis命令可以用来查找文件。
(1)which
which的语法格式如下:
which command
主要用来搜索二进制文件、可执行文件或者Shell命令行的位置。
(2)whereis
whereis的语法格式如下:
whereis command
主要用来查询二进制文件的位置、源代码的位置和man帮助文件位置。
比如“whereis find”会返回如下信息:
/usr/bin/find /usr/share.man.manlp/find.lp.gz /usr/shre/man/man1/find.1.gz
(3)whatis
whatis的语法格式如下:
whatis command
主要用来从man帮助页面返回软件信息。
2.3.2 信息显示命令
Linux下有多个命令用于在命令行查看和管理文本文件。这些命令功能强大,可以完成在Windows中不可能完成的任务。
1.查看文件头——head
head命令主要用于查看文件的头部。它的语法格式如下:
head <FileName>
需要注意的是,在默认情况下,head命令只会显示文件的前10行。如果想显示更多的内容,请在命令中加入行数参数:
[root@localhost ~]#head -25 foo
2.查看文件尾——tail
tail命令与head相对应,它主要用于显示文件的尾部。这对于显示一个系统记录信息的文件十分有用,因为最近的信息总是位于文件的最后。Tail命令还有一个很有用的参数“-f”,这个参数可以让tail命令实时更新显示最后的10行,如图2-9所示。比如:
图2-9 tail命令可以实时显示系统信息
[root@localhost ~]#tail -f /var/log/messages
需要退出时,请按下“Ctrl+C”组合键。
3.分页查看——more
more命令是Linux下最常用的文本文件分页查看命令。它的语法格式如下:
more <FileName>
操作起来只需要记住3个按键,“Space(空格)”向前翻页、“Enter(回车)”前翻一行、“Q”退出,如图2-10所示。
图2-10 最简单易用的文本文件分页查看命令more
4.分页查看——less
其实,Linux下还有另外一个功能更加强大的文件文本分页查看命令。它的语法格式如下:
less <FileName>
与more命令相比,less的功能更加强大,不但可以前翻一页(Space键或者PageDown键),还可以后翻一页(B键或者PageUp键),而且可以前后翻行(前翻是↑键,后翻是↓键),当然Q键是退出。
另外,less命令还可以查询文本文件中包含的字符串,直接按下“/”键,然后输入需要查询的字符串并按回车键就可以了,如图2-11所示。
图2-11 功能更加强大的文本文件分页查看命令less
5.查看与创建文件——cat
cat命令不但可以用于查看文件,还可以创建文件或者合并文件。这从它的全名——concatenate(合并)可窥一二。
单独输入cat命令,会接受你通过键盘输入的任何字符,并在按下回车键时在屏幕上显示出来。终止该状态时按“Ctrl+D”组合键。
如果输入以下命令,则表示查看一个文件的内容:
[root@localhost ~]#cat /var/log/messages
需要提醒大家的是,如果文件内容很多,则cat命令显示时会快速翻屏,测试最好通过管道和more或者less命令配合查看。
[root@localhost ~]#cat /var/log/messages — less
6.从文件中查找信息——grep
grep命令主要用来从指定的文件中搜索相应的字符串,它的语法格式如下:
grep String <FileName>
比如,以下命令表示从/var/log/messages文件中查找错误信息:
[root@localhost ~]#grep "error" /var/log/messages
小提示
Linux可以在一行中输入多条命令,按回车键之后自动运行,比如:
[root@localhost ~]#mkdir ~/source/; mv linux-2.6.25.4.tar.gz ~/shource/
不同命令间以“; ”号分割。
7.查看二进制文件——od
前面的文件查看命令针对的都是文本文件,如果文件本身不是文本的,而是二进制形成的,该怎么办呢?为了不在屏幕上显示很多乱码,我们就要借助Linux下的二进制文件查看命令od。
od令的语法格式如下:
od [-abcdfhilovx] [-A <字码基数>][-j <字符数目>][-N <字符数目>][-s <字符串字符数>] [-t < 输出格式>][-w <每列字符数>][--help][--version][文件...]
参数说明:
➢ -a,此参数的效果 和同时指定“-ta”参数相同。
➢ -A<字码基数>,选择要以何种基数计算字码。
➢ -b,此参数的效果和同时指定“-toC”参数相同。
➢ -c,此参数的效果和同时指定“-tC”参数相同。
➢ -d,此参数的效果和同时指定“-tu2”参数相同。
➢ -f,此参数的效果和同时指定“-tfF”参数相同。
➢ -h,此参数的效果和同时指定“-tx2”参数相同。
➢ -i,此参数的效果和同时指定“-td2”参数相同。
➢ -j<字符数目>或--skip-bytes=<字符数目>,略过设置的字符数目。
➢ -l,此参数的效果和同时指定“-td4”参数相同。
➢ -N<字符数目>或--read-bytes=<字符数目>,到设置的字符数目为止。
➢ -o,此参数的效果和同时指定“-to2”参数相同。
➢ -s<字符串字符数>或--strings=<字符串字符数>,只显示符合指定的字符数目的字符串。
➢ -t<输出格式>或--format=<输出格式>,设置输出格式。
➢ -v或--output-duplicates,输出时不省略重复的数据。
➢ -w<每列字符数>或--width=<每列字符数>,设置每列的最大字符数。
➢ -x,此参数的效果和同时指定“-h”参数相同。
➢ --help,在线帮助。
➢ --version,显示版本信息。
2.3.3 网络基本配置命令
Red Hat Enterprise Linux 5中的网络配置命令主要有ifconfig(配置各种网络参数)、route(配置/修改路由表)、ifup和ifdown(启动和关闭某个网络适配器)。
1.ifconfig
ifconfig是Linux下最主要的网络配置命令,主要用于配置IP地址、网段、子网掩码等信息,并且可以用来启动/关闭网络适配器。它的语法格式如下:
ifconfig interface [options]
参数说明:
➢ network:配置网段。
➢ broadcast:广播网段。
➢ netmask:子网掩码。
➢ up—down:启动—关闭网络接口。
比如,我们可以这样查看eth0网卡的网络配置信息,如图2-12所示。
图2-12 查看eth0网卡的网络配置信息
信息说明:
➢ eth0:网卡代号(一般指的是第一个ethernet网卡)。
➢ HWaddr:网卡的MAC地址(也就是硬件地址)。
➢ inet addr:网卡的IPv4地址。
➢ inet6 addr:网卡的IPv6地址。
➢ Bcast:广播地址。
➢ Mask:子网掩码。
➢ MTU:Maximum Trasmission Unit的缩写,最大传输单元(以字节为单位)。即此接口一次所能传输的最大封包,这个数值并非越大越好,也非越小越好。设置错误时,可能会让网络无法连接上某些网站。
➢ RX:网络从启动到目前为止的接收情况。
➢ TX:网络从启动到目前为止的传送情况。
➢ collisions:网络讯号碰撞的情况说明。
➢ txqueuelen:表示传输缓冲区长度大小。
2.route
Linux下的route命令主要用于显示/修改路由表,它的语法格式如下:
route [-nNvee] [-FC] [<AF>] ;查看内核路由表 route [-v] [-FC] {add—del—flush} ;修改路由表
参数说明:
➢ -n:列出的信息以IP来显示。
➢ -ee:列出较长列的信息。
➢ add:增加路由信息。
➢ del:删除一个路由信息。
➢ -net:增加一个“网段”的路由,例如C类网段。
➢ -host:增加到某个IP主机的路由。
➢ netmask:子网掩码。
➢ gw:路由网关。gw是以IP来设置的。
➢ dev:路由网关。dev是以接口来设置的。
比如,直接执行以下命令,就会显示内核路由表,如图2-13所示。
图2-13 执行route命令显示的内核路由表
route -n
3.ifup—ifdown
ifup和ifdown是Linux下用来启用或者暂停某个网络接口的命令。它的命令行格式如下:
ifup [interface] ifdown [interface]
比如:
ifup eth0 ;启用eth0网卡(见图2-14) ifdown eth0 ;禁用eth0网卡
【实例】
图2-14 用ifup命令启用网卡
Linux操作系统下的网卡IP地址主要是通过ifconfig、route和其他命令综合来完成的。
1 设置网卡IP地址。
比如,以下命令设置网卡的IP地址为192.168.0.3,如图2-15所示。
图2-15 设置网卡IP地址和网关
[root@localhost ~]#ifconfig eth0 192.168.0.3 netmask 255.255.255.0 broadcast 192.168.0.255
{L-End} 2 设置网关。
执行以下命令设置网关:
[root@local root]# route add -net 192.168.0.0 netmask 255.255.255.0 dev eth0 [root@local root]#route add default gw 192.168.0.1
{L-End} 3 设置DNS服务器。
其实,网络配置不但要配置网卡,还需要设置合适的DNS服务器,否则即使网络配置好了,也不能访问Internet。
最简单的DNS设置是修改/etc/resolv.conf,进行主机名称与IP地址的对应。请注意:如果你采用局域网共享上网,那么这个文件中输入的很可能是局域网中的代理服务器的IP地址(192.168.0.1),如图2-16所示。
图2-16 /etc/resolv.conf用于配置客户端的DNS服务器
{L-End} 4 启用网卡。
最后不要忘记执行以下命令启用这个网卡:
[root@localhost ~]#ifup eth0
2.3.4 关机和注销命令
与Windows下的图形操作界面相比,Linux下的用户注销、关机命令有很多。
1.注销——logout
logout是Linux注销当前用户的操作命令,它与登录的login相对应。logout使用时不需要任何参数,如图2-17所示。
图2-17 注销之后就返回到了登录界面
[root@localhost ~]#longout
Red Hat Enterprise Linux Server release 5 (Tikanga)
Localhost login:
2.关机——shutdown
shutdown是Linux下最强大的关机、重启计算机命令,如图2-18所示。它的命令行语法如下:
图2-18 运行shutdown命令
shutdown [-t sec] [-arkhncfFHP] time [warning message]
参数说明:
➢ -t sec:过sec秒再关机。
➢ -a:只有用户名在/etc/shuwdown.allow中,才允许关机。
➢ -k:模拟关机——只发送警告信息。
➢ -h:关闭电源。
➢ -f:重启时跳过fsck检测。
➢ -F:重启时强制进行fsck检测。
➢ -c:终止上次进行的重启或者关机操作。
➢ time:何时关机。
➢ warning message:在用户端显示的警告信息。
比如:
shutdown -h now ;立即关机并关闭电源 shutdown -h +5 ;5分钟后关机并关闭电源 shutdown -r 10:30 ;10:30重新启动计算机
3.重启、关机——reboot、halt
reboot和halt是Linux下最简单的分别用来重启或者关闭计算机的两条命令,一般不需要什么参数,直接执行就是了。
其实,halt就是通过调用shutdown命令来完成关机操作的(严格地说是shutdown -h),而reboot则与halt差不多。
4.init——关机、重启样样通
我们知道,init是所有进程的祖先,所以要用init来完成关闭操作系统这种操作,也是轻而易举的一件事情。init可以完成的事情包括:
➢ 0:关闭计算机。
➢ 1:单用户模式。
➢ 2:多用户模式,但不支持NFS。
➢ 3:全功能多用户模式。
➢ 4:未使用。
➢ 5:图形界面模式。
➢ 6:重启。
想要init切换到哪个模式下,比如0(也就是关机),只需要执行以下命令就OK了:
init 0
2.4 环境变量及Shell配置文件
环境变量是和Shell紧密相关的,用户登录系统后就启动了一个Shel(l对于Linux来说一般是Bash,但也可以重新设定或切换到其他的Shell)。环境变量是通过Shell命令来设置的,设置好的环境变量又可以被所有当前用户运行的程序所使用。
2.4.1 Shell环境变量
对于Bash这个Shell程序来说,可以通过变量名来访问相应的环境变量,通过export来设置环境变量。下面通过几个实例来说明。
1.显示环境变量
环境变量的引用是通过一个“$”符号加变量名来实现的,比如,我们要查看自己的家目录在哪里,就需要使用“$HOME”环境变量,可以使用echo命令来显示它的值,如图2-19所示。
图2-19 显示用户家目录
[root@localhost ~]#echo $HOME
小提示
需要注意的是,环境变量与其他Linux命令一样,也是严格区分大小写的。比如,用来代表用户家目录的$HOME,就要全部大写。
2.显示所有环境变量
使用echo命令显示环境变量值需要准确知道变量名,但对于大多数人来说并不知道名字,又想进一步了解变量,该如何处理呢?用“env”命令看看吧,如图2-20所示。
图2-20 用env命令查看环境变量
[root@localhost ~]#env
对于Red Hat Enterprise Linux 5来说,默认的环境变量可以参考表2-1。
表2-1 通用Shell 环境变量
3.设置环境变量
我们可以使用以下命令设置一个环境变量:
[root@localhost ~]# variable=value
其中,variable是变量名字,value则是准备赋予它的值。比如,定义一个foo变量:
[root@localhost ~]#foo=bar
小提示
赋值之后,一般应该马上使用export命令使环境变量生效。比如:
[root@localhost ~]#foo=bar [root@localhost ~]#export foo
以上两条命令也可以简写为“export foo=bar”。
4.取消环境变量
Linux下取消某个环境变量的命令是unset,比如,以下命令将取消环境变量TEST。
[root@localhost ~]#unset $TEST
5.设置只读环境变量
我们还可以将一个环境变量设置成不可修改的只读状态,比如:
[root@localhost ~]#export Test="This is a test env…" [root@localhost ~]#readonly TEST
【实例】
在Linux下为了使用方便,很多时候都需要设置一些环境变量。相对于Windows下的环境变量设置,Linux下不但提供了多达3种的设置方法,而且设置起来还比较简单。
【方法一】修改/etc/profile文件
这种方法最一劳永逸,因为设置一处,就对所有用户生效。
1 用文本编辑器比如vim打开/etc/profile文件。
{L-End} 2 在文件的尾部加入环境变量的定义,比如:
JAVA_HOME=/usr/share/jdk PATH=$JAVA_HOME/bin:$PATH CLASSPATH=.:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar export JAVA_HOME export PATH export CLASSPATH
小提示
Linux环境变量下的多个路径之间以“:”号分割。
{L-End} 3 重新登录系统。
【方法二】在Shell下设置变量
需要注意的是,在Shell下设置环境变量,只对当前Shell有效。如果注销或者重新启动了,就需要重新设置环境变量,所以,这种方法不推荐使用。
只需要在Shell下执行以下3条命令即可:
export JAVA_HOME=/usr/share/jdk export PATH=$JAVA_HOME/bin:$PATH export CLASSPATH=.:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar
【方法三】修改~/.bashrc文件
这种方法可控性最强,因为修改之后,只对当前用户有效,但又不用每次重启系统时都要修改。
1 用文本编辑器比如vim打开~/.bashrc文件。
{L-End} 2 在文件的尾部加入环境变量的定义,比如:
set JAVA_HOME=/usr/share/jdk export JAVA_HOME set PATH=$JAVA_HOME/bin:$PATH export PATH set CLASSPATH=.:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar export CLASSPATH
{L-End} 3 重新登录系统。
2.4.2 Shell环境配置文件
在你的目录下,运行:会看到下面这些文件,如图2-21所示。
图2-21 Shell环境配置文件
[root@localhost ~]#ls .bash*
➢ .bash_history:记录了你以前输入的命令。
➢ .bash_logout:当退出Shell时,要执行的命令。在默认配置下,它只是清屏。
➢ .bash_profile:当你登入Shell时,要执行的命令。该文件设置了路径,同时为某些内容设置环境变量,如邮箱的位置或历史文件的大小。最后,/etc/profile从/etc/profile.d目录下的配置文件中收集Shell设置
➢ .bashrc:每次打开新的Shell时,要执行的命令。它用于设置默认提示符,可以添加一个或更多别名。
请注意.bash_profile和.bashrc文件的区别:.bash_profile只在会话开始时被读取一次,而.bashrc则每次打开新的终端时都要被读取。按照习惯,应该将定义的变量如PATH,放到.bash_profile中,而像aliases(别名)和函数之类,则放在.bashrc中。但由于.bash_profile经常被设置成先读取.bashrc的内容,所以为了方便,就把所有配置都放进.bashrc中。
这些文件是每一位用户的设置,系统级的设置存储在/etc/profile、/etc/bashrc及目录/etc/profile.d下的文件中。但你得习惯用各自的配置文件:编辑不需要root权限,还可以使设置更有个性。当系统级与用户级的设置发生冲突时,将采用用户级的设置。
2.4.3 设置提示符
不知道读者朋友们是否注意到,每次登录到Linux的命令行下时,都会看到一些这样的提示,如图2-22所示。
图2-22 Linux登录提示信息
Red Hat Enterprise Linux Server release 5.2 (Tikanga) Kernel 2.6.18-92.el5xen on ani686 Localhost login:root Password: Last login: Tue Dec 23 18:21:49 on :0 [root@localhost ~]#
其中的“[root@localhost ~]#”就是命令行提示符设置的,表示当前的登录用户是“root”(@号前的提示信息),登录计算机名是“localhost”,当前目录是“~”(用户家目录),登录权限是管理员(“#”提示符,一般用户是“$”)。
命令行提示符是可以定制的,可以通过以下命令来查看当前的提示符设置,如图2-23所示。
图2-23 命令行提示符设置
[root@localhost ~]#echo $PS1 [\u@\h \W]\$ [root@localhost ~]#echo $PS2 >
可以看出,默认的PS1变量设置是“[\u@\h \W]\$”,具体含义如下:
➢ \u,当前登录用户名。
➢ \h,当前计算机名。
➢ \H,当前计算机名的全域名。比如rhel.localdomain.tst。
➢ \w,当前目录的绝对路径,比如“/usr/clinuxer”。
➢ \W,当前目录名,比如“clinuxer”。
➢ \$,一般用户为“$”, root用户为“#”。
时间信息则有更多格式:
➢ \t,当前时间(24小时制,HH:MM:SS分别代表小时:分钟:秒)。➢ \T,当前时间(12小时制)。
➢ \@,当前时间(AM/PM显示)。
➢ \d,当前日期。
另外,还可以设置Shell的版本提示信息:
➢ \v, Bash版本号。
➢ \V, Bash的发布版本号。
➢ \S, Shell名称。
➢ \! , Bash命令的历史编号。
➢ \I, Shell的终端名称。
最后需要说明的是,命令行提示符中还有些控制符:
➢ \\,表示“\”。
➢ \n,表示回车换行。
➢ \r,表示换行。
➢ \e,表示Esc。
2.5 使用vim文本编辑器
用于编辑文本文件(比如源代码或者系统配置文件)的文本编辑器相信所有用户都会有机会接触到,好似DOS年代的Edit、Windows 98上的记事本,相信都给各位留下了非常深刻的印象。
而在Linux的世界中,使用最为普遍的编辑器当属vi无疑,Red Hat Enterprise Linux 5中通过了它的增强版vim。如果想学习在任何Linux/UNIX主机上都会提供的一款文本编辑器,那就毫无疑问是vim了。
2.5.1 vim编辑器的基本模式
vi是英文Visual Editor的缩写,而vim则代表了Vi Improved(增强版vi)。vim有3种模式:指令模式、插入模式和指令行模式。
➢ 当打开vim时,首先进入的是指令模式,此时输入的任何字符都被当作指令,用于对文件进行编辑操作或者切换到其他模式。
➢ 插入模式是用户使用最多的工作模式,此时可以从当前光标所在位置插入正文。按Esc键可以从插入模式切换到指令模式。
➢ 指令行模式用来向vi输入特定的扩充指令。在指令模式中键入“:”就可以切换到指令行模式。在指令行模式中,用户输入的单行指令会显示在屏幕的最底行,按Enter键后才会确认执行。
2.5.2 运行vim
要进入vim可以直接在系统提示符下键入如下命令:
[root@localhost ~]#vim <文件名称>
vim可以自动帮助我们打开所要编辑的文件(没有就新建一个)。当新建一个文件时,屏幕左方会出现波浪符号“~”,行首带有该符号的行尽管会在屏幕中显示,其实并不是文件的一部分。屏幕底下会显示当前编辑文本的文件名称。此时vi处于指令模式,你可以通过键入指令“i”切换到插入模式,如图2-24所示,更多的指令可以参考下一节的内容。
图2-24 Linux/UNIX上最通用的文本编辑器vim
2.5.3 vim常见命令
vim命令众多,要想熟练掌握需要时间,不过大家只要在平时使用的过程中多多操练,相信可以熟能生巧。
1.插入模式
vim刚启动的时候,一般处于指令模式,用户可以利用以下这些命令切换到插入模式。
(1)新增(append)
➢ a,从当前光标所在位置之后插入正文。
➢ A,从当前光标所在列最后面的地方插入正文。
(2)插入(insert)
➢ i,从当前光标所在位置之前插入正文。
➢ I,从当前光标所在列的第一个非空白字符之前插入正文。
(3)开始(open)
➢ o,在当前光标所在列下方新增一列并进入插入模式。
➢ O,在当前光标所在列上方新增一列并进入插入模式。
用户也可以用下面这行命令将其他文件的正文插入到当前光标所在的位置:
:r <旧文件名称>
或者用以下命令将Shell命令执行后的结果插入光标所在的位置:
:r [shell命令]
例如,在指令模式中键入“:r file”,将得到如图2-25所示的结果。
图2-25 在命令模式中插入其他文件的正文
2.编辑模式快捷键
配合一般键盘上的功能键,如“Insert”、“Delete”及方向键等,现在你应该可以利用vim来处理文字资料了。不过,要想让vim的操作更上一层楼,最起码的应该了解以上的命令。
(1)删除与修改
在vim的原始观念里,输入与编辑完全是两回事。编辑是在指令模式下操作的,先利用命令移动光标来定位要编辑的地方,然后才下命令进行编辑。
➢ x:删除光标所在的字符。
➢ dd:删除光标所在的行。
➢ r:修改光标所在的字符,r后接着要插入修正的字符。
➢ R:进入覆盖状态,直到按Esc键回到指令模式下。
➢ s:删除光标所在的字符,并进入插入模式。
➢ S:删除光标所在的行,并进入插入模式。
(2)移动光标
由于许多编辑工作是借助光标定位来完成的,所以vim提供了许多移动光标的命令。在指令模式下移动光标的基本命令有h、j、k、l, PC键盘上的方向键也可以起到同样的作用,而且无论是在指令模式还是输入模式下都可以应用,这可算是PC键盘为用户提供的便利之处了。用来移动光标的命令还有:
➢ H:移动到屏幕的第一行。
➢ M:移动到屏幕的中间行。
➢ L:移动到屏幕的最后一行。
➢ G:移动到文档的最后一行。
➢ B:移动到下一个单词的第一个字母。
➢ W:移动到上一个单词的第一个字母。
➢ E:移动到下一个单词的最后一个字母。
➢ 0:移动到当前行的第一个字符,其功能等同按Home键。
➢ $:移动到当前行的最后一个字符,其功能等同按End键。
➢ ^:移动到光标所在行的第一个非空白字符。
➢ n-:减号表示移动到上一列的第一个非空白字符,前面加上数字可以指定往上移动n行。
➢ n+:加号表示移动到下一列的第一个非空白字符,前面加上数字可以指定往下移动n行。
➢ nG:移动到第n行。
➢ fx:往右移动到x字符上。
➢ Fx:往左移动到x字符上。
➢ tx:往右移动到x字符前。
➢ Tx:往左移动到x字符前。
➢ ; :配合f和t命令使用,重复一次。
➢ , :配合f和t命令使用,反方向重复一次。
➢ /string:往右移动到有string的地方。
➢ ? string:往左移动到有string的地方。
➢ n:配合/和?命令使用,重复一次。
➢ N:配合/和?命令使用,反方向重复一次。
➢ n(:左括号表示移动到句子的最前面,前面加上数字可以指定往前移动 n 个句子(句子是以!、.、?3种符号来界定的)。
➢ n):右括号表示移动到下个句子的最前面,前面加上数字可以指定往后移动n个句子。
➢ n{:左括弧表示移动到段落的最前面,前面加上数字可以指定往前移动n个段落。
➢ n}:右括弧表示移动到下个段落的最前面,前面加上数字可以指定往后移动n个段落。
➢ Ctrl-u:向上滚屏半页。
➢ Ctrl-b:向上滚屏一页(等同按PageUp键)。
➢ Ctrl-d:向下滚屏半页。
➢ Ctrl-f:向下滚屏一页(等同按PageDown键)。
是不是很复杂?相比于Windows下的文本编辑器,这个vim功能倒是强大,就是操作太烦琐了。不过,任何事情都有两面性,vim虽然复杂,但它适用于所有的Linux/UNIX操作系统,并且适合所有的大型、小型主机和终端机,而不像Windows仅仅局限于PC。用户若肯努力训练肯定会获益匪浅的。
3.高级编辑命令
熟悉并掌握上述命令以后,想必各位用户会对vim有更深的认识,在处理文字上也不会有什么麻烦了。在这里再介绍一些vim的进阶编辑命令,以便用户可以进一步简化操作过程。
这些编辑命令非常有弹性,基本上可以说是由命令和范围所构成的。例如,dw是由删除命令d与范围w所组成的,代表删除一个字d((elete) w(ord))。
命令如下:
➢ d:删除(delete);
➢ y:复制(yank);
➢ p:放置(put);
➢ c:修改(change)。
范围可以是下列几个:
➢ e:光标所在位置到该字的最后一个字母。
➢ w:光标所在位置到下个字的第一个字母。
➢ b:光标所在位置到上个字的第一个字母。
➢ $:光标所在位置到该列的最后一个字母。
➢ 0:光标所在位置到该列的第一个字母。
➢ ):光标所在位置到下个句子的第一个字母。
➢ (:光标所在位置到该句子的第一个字母。
➢ }:光标所在位置到该段落的最后一个字母。
➢ {:光标所在位置到该段落的第一个字母。
值得注意的是,删除与复制都会将指定范围的内容放到缓冲区里,然后就可以用命令p粘贴到其他地方,这是vim用来处理区段拷贝与搬移的办法。
对于整列操作,vim另外提供了更方便的编辑命令。前面曾经提到过删除整行文字的命令dd就是其中一个;命令cc可以修改整行文字;而命令yy则用于复制整行文字;命令D可以删除光标到该行结束范围内所有的文字。
其实,vim已经大幅度简化了这一堆命令。如果稍微观察一下这些编辑命令就会发现其实是设定范围的方式有点杂乱,实际上只有4个命令。命令v非常好用,只要按下V键,光标所在的位置就会反白,然后就可以移动光标来设定范围,再直接下命令进行编辑即可,如图2-26所示。
图2-26 设定范围
4.存盘退出
➢ :q:退出vim。如果当前文档已经修改而又没有存盘,则会返回错误信息。
➢ :q! :不保存对文档所作的修改,强制退出。
➢ :n, mw filename:将第n行到第m行的文字存放到指定的filename中。
➢ :w <filename>:另存为filename。
➢ :wq:存盘退出。
➢ ZZ:存盘退出(在指令模式下使用)。
【实例】
Linux下的vim编辑器功能强大,要想用好需要掌握众多的快捷操作。这里不准备做过多的细节介绍,只是用它来编写一个最简单的C语言程序——HelloWorld.c。
1 在Linux命令行下,输入以下命令打开vim:
[root@localhost ~]#vim HelloWorld.c
{L-End} 2 现在处于vim的命令模式下,按I键进入编辑窗口,依次输入以下命令:
#include <studio.h> int main() { printf("Hello World\n"); returen 0; }
{L-End} 3 按Esc键回到命令模式,然后输入以下命令存盘退出:
:wq
这里只是演示一个最简单的文本文件编辑过程,如果您想学习更多的其他操作,就只有靠自己摸索了。
2.5.4 定制丰富多彩的vim
vim可以算是一个强大的可定制文本编辑器平台,它的可配置性异常强大,现在我们就来看看。
1.改变颜色
当工作在控制台时,一般使用的是黑色的背景和白色的前景字,这看起来比较呆板,我们可以为它改变颜色。
vim的颜色设置是通过颜色配置文件来实现的,而这些文件放在了vim安装目录的colors目录下,到这个目录下就可以看到已经安装的各种颜色设置文件。我们可以使用下面的命令在已经安装的颜色中进行切换:
:colorscheme
输入以上命令后,按下空格键,再按Tab键就可以在不同的颜色之间切换。比如默认的第一个颜色“Blue”就和DOS下的Editor一样,蓝底白字,如图2-27所示。
图2-27 为vim换换颜色
2.多窗口编辑
在vim的命令行上,输入以下命令:
:split helloworld.cpp
会把当前窗口分成两个,并且打开编辑helloworld.cpp文件。
3.更多选项这里找
需要说明的是,vim默认启动采用的是vi兼容模式,这就意味着vi的很多强大功能被关闭了。要打开这些功能,最简单的方法是在家目录下创建一个“.vimrc”文件,在该文件中对vim进行配置。
比如,打开自动缩进:
:set autoindent
其实,vim的可定制性绝对不止以上所介绍的这些,比如它经过定制,可以成为一个程序开发中心(集编辑、运行、出错于一身)。