Linux基础自学手册
http://www.cnblogs.com/kevin-zlg/p/4364001.html
这篇分享面对的对象主要是想要快速上手使用linux系统,但又从未接触过linux的同学。文档主要描述的是linux操作系统的基本使用方法,没有涉及到linux下的程序设计,所以主要是偏应用而不是研发。为了方便大家在自己的电脑上使用自己的linux系统,文档中第一、二章介绍了vmware虚拟机使用的详细步骤和redhat企业版操作系统的安装流程。根据一般linux系统的使用情况,文档第三章介绍了终端的概念和linux下的常用命令,第四章介绍了系统的文件目录结构,使用户能按照linux不同目录的不同功能去正确地使用系统。第五章介绍了linux系统下应用最广泛的vi编辑器,在此基础上再介绍gcc编译器的使用,基本满足了linux下写简单程序所需掌握的要求。第七和第八章是根据linux下配置系统时经常遇到的脚本文件和makefile文件做一个简单介绍,希望达到看懂文件并能准确修改以解决工作问题的目的。
由于水平有限,文章中难免会有许多的错误,希望和大家一起讨论,共同进步。
在虚拟机没有流行之前,人们要想在日常中使用linux系统一般都是通过装双系统。但是这样windows和linux的交互往往要通过搭建samba服务器,对于新手来说学习linux系统显得非常麻烦和困难。现在通过使用虚拟机,可以在电脑上同时运行多个操作系统,而且虚拟机提供的各种扩展功能使linux的使用和安装都变得非常方便。下面介绍比较常用的虚拟机vmware的使用。
打开vmware,点击如图new virtual machine 按钮,弹出如图1-2所示的新建虚拟机界面,选择typical,可以更简单得配置虚拟机的参数,其实很多参数默认的就可以,而且选择custom时配置的参数等虚拟机装好之后还是可以修改的,为了更快的装上系统,这里选择typical安装。
图 1-1
图 1-2
点击next,进入选择安装方式目录,可以选择从光驱安装或是从操作系统镜像安装,现在网络上都有各种操作系统的iso镜像,只要下载下来就可以安装了,同时在公司的共享目录: \系统集成\应用软件部\操作系统中也有如图1-4的redhat企业版镜像,将镜像复制到本地目录,并在installer disc image file(iso) 选项中选中复制过来的镜像文件,点击next进入下一步。
图1-3
图1-4
如图1-5,输入用户名和密码,该用户是你登录系统时的默认用户,下面注释的意思是此次给dahua设置的密码同时也是root用户的密码。和ubuntu系统不同,redhat在系统安装时就会给系统建立root用户,而ubuntu要在安装后新建root用户。
图1-5
填好用户名和密码后进入图1-6界面,填写虚拟机的名字和存放路径,随后设置虚拟机硬盘大小(图1-7)。这里设置的大小其实只是一个虚拟的硬盘最大限额,其实际大小在安装好后往往只占3G左右,所以这里设置20G不用担心,不会一下子用掉硬盘20G空间。这个20G设置本来的意思是以后虚拟机的数据不断变多,其占的空间也会不断变大,但是最大不能超过20G。不过vmware自身又能在安装后系统后修改这个值,所以这里设置多少其实关系不大,不够以后再改就行了。
图1-6
图1-7
最后进入如图1-8界面,显示的是新建虚拟机的配置信息,这些信息基本都可以再修改,点击finish配置完成,进入安装操作系统界面。
图1-8
现在安装操作系统步骤都非常简单,基本都下一步就可以了,而redhat安装基本连下一步的选项都不用,直接等待结束就可以了,如图2-1.在安装过程中,vmware还会自动安装上vmware tools,这个工具以前都是手动装的,现在随着vmware版本的升级,功能做得越来越完善了。通过这个工具,用户可以方便的在主机界面(对我们来说是windows)和虚拟机界面(redhat)自由切换,还可以来回复制粘贴,文件共享等。
图2-1
最后安装vmware tools时间比较久,要耐心等待,完成后就是会提示输入用户名和密码,如图2-2,输入之前设置的用户名dahua和密码可以登录了,当然,这里也可以使用root用户登录,密码同dahua的一样。
图2-2
登录系统后就能看到redhat的桌面(图2-3),桌面上有大家熟悉的我的电脑,回收站等图标。Linux系统最初是没有图形界面的,用户的操作都是在终端中进行,后来为了降低使用的难度,增加用户群体,开发出了图形操作界面,使用户能像使用windows一样使用linux操作系统。
图2-3
Linux下和windows共享文件比较常用的samba,现在vmware自带了共享windows下文件夹的功能,通过此功能,能使虚拟机中的系统使用到主机的文件。设置步骤如下:
Vm->settings->options,在图2-5中选择always enabled ,点击add,在图2-6中选择要共享的windows目录,我选择了整个D盘,并为该目录取个名字。
图2-4
图2-5
图2-6
图2-7
完成后,就可以在/mnt/hgfs/D/目录下看到windows中D盘的内容,如图2-8是在图形界面下打开linux下/mnt/hgfs/D/ 目录显示的内容,对这个目录的操作相当于在windows下对D盘中文件的操作,可以方便得实现数据共享。
图2-8
虽然如前面看到的,现在的linux系统可以像windows系统一样,使用图形界面进行方便得操作,但是大多数的情况下人们是不使用图形界面的linux系统的,因为工作中往往是通过远程登录linux服务器,所有的操作都要在终端界面下进行,所以了解linux下shell终端的使用是必须的。
Shell是一个系统程序,在前台提供Linux系统与用户交互操作的界面;另外一方面Shell是一个命令的编译解释器,会将用户命令经过编译和解释后,交给内核进行执行,也就是说将用户命令解释为系统和内核可以理解和识别的机器语言。
我们目前所使用的操作系统实际上是一个核心(内核Kernel)。作为使用者无法直接对内核(Kernel)进行操纵,而是通过内核的“外壳程序”来与内核进行沟通,这个外壳程序因此得名,实际上就是Shell。
Shell是使用者与系统的一个互动界面,主要是要使用者通过命令行来完成工作,所以Shell的定义就是命令的编辑解释器:将使用者的命令翻译给核心;将核心处理结果翻译给使用者。
当用户登录的时候,就获得了一个Shell。
Shell和内核实际上是不同的两套软件:不同的操作系统上可以使用不同的Kernel,而相同的操作系统上也可以使用不同的Shell。
Shell的种类如下,使用最广泛的是bash,其它的使用方法基本相同,只需了解一下。
① Bsh:是Bourne Shell的简称,是较早的UNIX Shell程序,实现了基本的Shell程序功能,除了承担命令解释器的功能外,Bsh还是编程语言。
② Csh:是C Shell的缩写,使用C语言的语法风格。Csh与Bsh相比,更加适合于用户命令交互。
③ Ksh:结合了Bsh和Csh两者的功能优势,兼有Bsh的语法和Csh的交互特性。
④ Bash:是Bsh的升级替代品。是GNU项目的成员,也是著名的开源软件项目。大多数Linux发行版本都使用Bash作为默认的Shell,当运行Shell程序时,系统实际运行的是Bash程序。
图3-1
如图3-1,找到terminal,将其拖到桌面方便以后使用。打开terminal显示如图3-2.表示本地的root用户在使用此终端。
图3-2
Linux下常用的命令如下表3-1,其中红色的表示我认为更加简单实用的命令,这些命令的使用频率非常高,一定要好好掌握。
命令 解释 用法 举例 ls 显示某一个目录下的内容(文件和目录) 用法: ls 或者ls 目录 ls ls后为空时表示显示当面目录下的内容。可以在ls后面加上所要查看的目录路径名称 ls / ls /home/ ls /etc/sysconf ls -l 详细显示 用法:ls –l 或者 ls –l 目录 ls -l 注:l为字母,不是数字1。 ls –l /home ls -a 显示所有的文件 用法:ls –a 或者 ls –a 目录 ls –a 以.开始的文件为隐藏文件,此时也会显示,其他情况下不显示 ls –la /etc/ cp 复制文件 用法:cp 原文件 目标文件 cp /home/lion/test1 /home/lion/test/test2 注:文件可以加上路径名 cp -r 复制整个目录 用法:cp –r 原目录 目标目录 cp /home/lion/mjli /home/lion/test/mjli2 注:目录下的所有文件都会复制 mv 移动文件或者目录 和cp用法类似,但是移动后,原文件或者目录不存在。 mv /home/lion/test1 /home/lion/test2 注:移动目录时不用-r参数 mv /home/lion/mjli /home/lion/mjli2 touch 创建文件 用法:touch 文件名 touch /home/lion/test1 mkdir 创建目录 用法:mkdir 目录名 touch /home/lion/mjli rm 删除文件 用法:rm 文件名 rm /home/lion/test1 rm -r 删除目录 用法:rm –r 目录名 rm –r /home/lion/mjli2 rmdir 删除空的目录 用法:rmdir 目录名 rmdir /home/lion/mjli2 注:此目录必须为空,否则无法删除 cd 改变目录路径 用法:cd 目录名 cd /etc cd /home/lion cd .. 到上一层目录中 用法:cd .. cd .. cd / 到根目录下 用法:cd / cd / pwd 显示当前的目录路径 用法:pwd pwd cat 查看文件内容 用法:cat 文件名 cat /home/lion/test1 more 查看较长内容的文件 用法:more 文件名 ls –l | more 注:more可以和别的命令连用,如 ls –l | more more /home/lion/test2 注:在显示中, 按空格键滚动一页,按回车键滚动一行,按q键退出 less 查看较长内容的文件 与more用法类似。 less /home/lion/test2 在显示中,按y可以向上滚动一行 ps aux 查看系统的进程 注意:参数aux最好一起使用 ps aux kill -9 杀死进程 用法:kill -9 PID kill -9 1231 注:PID(进程ID)可由ps aux命令来获取 w 显示在线用户信息 用法:w w 注:比命令who的信息详细 who top 显示系统任务信息,包括cpu、内存等 用法:top top mesg 是否接受其他人的write信息 用法:mesg y或者mesg n mesg y 注:y为接受,n为不接受。 mesg n write 传送信息给其他用户 用法: write 用户 或者 write 用户 TTY。 write lion 注:TTY用于有区别多个同样的用户,可由w命令来获取。 write lion pts/2 passwd 修改密码 用法:passwd passwd 注:超级用户可修改其他用户密码,此时为passwd 用户 du 显示目录下的各个文件的占用磁盘情况(包括子目录下文件) 用法:du 目录名 du 注:无目录名时为当前目录 du /home/lion du -s 显示目录下的所有文件的大小 用法:du –s 目录名 du –s 注:无目录名时为当前目录 du –s /home/lion date 显示系统日期和时间 用法:date date uptime 显示系统运行时间 用法:uptime uptime clear 清除当前屏幕 用法:clear clear wc 统计文件,给出文件的行数、字数、字符数 用法:wc 文件名 wc /home/lion/test1 grep 过滤文本 和其他命令连用,如 ls –l|grep string ls |grep sring为只显示具有string的行 cat /home/lion |grep hehe cat 文件名|grep string为只显示文件中具有string的行 ps aux|grep test1 grep –n 过滤文本,把所找到的行在行前加上行号列出 用户与grep类似,加上参数即可 ls –l|grep –n string ps aux|grep -n test1 grep –v 过滤文本,把不包含给定string的行列出 用户与grep类似,加上参数即可 ls –l|grep –v string ps aux|grep –v test1 grep string -r 搜索文本 用法:grep string –r 目录名 grep string –r / 在给定目录下搜索所有文件中含有string的行 grep hehe –r /home/lion 注:也可加-n –v参数。 df 查看系统硬盘信息 用法:df df free 查看系统内存信息 用法:free free ping 查看与对方机器是否连接 用法:ping IP地址或者域名 ping bbs.ustc.edu.cn ping 202.38.64.1 ifconfig 查看系统网卡信息 用法:ifconfig ifconfig 注:一般用户用 /sbin/ifconfig ifconfig|more route 查看系统的路由信息 用法:route route 注:一般用户用 /sbin/route echo 回应输入内容 用法:echo string echo hello 注:结果将显示string echo hehe whoami 显示当前正在进行操作的用户名 用法:whoami whoami exit 退出登录系统 用法:exit exit chmod 见下面说明 ctrl+C 中止程序执行 用法:ctrl+C ctrl+C ctrl+D 退出系统 用法:ctrl+D ctrl+D halt 关闭计算机 用法:halt halt reboot 重启计算机 用法:reboot reboot
表3-1
chmod为改变文件权限。在linux中,一个文件上有可读(r)可写(w)可执行(x)三种模式,分别针对该文件的拥有者(onwer)、同组者(group),和其他人(other)。一个文件如果改成可执行模式则系统就将其视为一个可执行文件,而一个目录的可执行模式代表使用者有进入该目录之权利。chmod就是用来变更一些文件的模式,其使用方式如下:
chmod [-R] mode 文件名
-R将所有子目录及文件改为你所要改成的模式。
其中模式即可以用数字表示也可以用字母表示,分别表示如下:
(1)数字
按照拥有者、同组者、其他人的顺序,给出一个三位的数字,r为4,w为2,x为1,例如 765 第一个数字7表示拥有者具有r+w+x的权限(7=4+2+1),第二个数字6表示同组者具有r+w权限(6=4+2),第三个数字5表示其他人具有r+x权限(5=r+x)。
用法: chmod 765 文件名
可将其中的数字更改为所需要的权限即可。
(2)字母
用法:chmod [ugo]+/-[rwx] 文件名
例如:chmod u+r /home/lion/test1 chmod ug+rx /home/lion/mjli/hello.com
其中[]可以同时出现,其意义分别如下:
+或者- |
r |
w |
x |
u |
u+r, u-r表示拥有者拥有或者取消可读权限 |
u+w, u-w表示拥有者拥有或者取消可写权限 |
u+x, u-x表示拥有者拥有或者取消可执行权限 |
g |
g+r, g-r表示同组者拥有或者取消可读权限 |
g+w, g-w表示同组者拥有或者取消可写权限 |
g+x, g-x表示同组者拥有或者取消可执行权限 |
o |
o+r, o-r表示其他人拥有或者取消可读权限 |
o+w, o-w表示其他人拥有或者取消可写权限 |
o+x, o-x表示其他人拥有或者取消可执行权限 |
表3-2
其他常用:
解释
>
输出由屏幕重定向到文件中,文件原来内容被清空
用法:命令 > 文件名
注:命令可以为以上的命令,文件名可有目录路径
ls –l > /home/lion/lsresult
>>
输出由屏幕重定向到文件的末尾中,文件原来内容被保留
类似 >,只是保留了原文件的内容。
ls –l >> /home/lion/lsresult
<
输入重定向,由文件的内容代替键盘输入
用法:命令 < 文件名
注:命令可以为以上的命令,文件名可有目录路径
wc < /home/lion/hehe
|
连接两个命令(前一个命令的结果作为后一个命令的输入)
用法:命令 | 命令
ls –l | more
ls | grep hello
ls | wc
.
当前目录
用法:./文件或者目录
ls ./
cp /home/lion/mjli ./test/
..
上一目录
用法:../文件或者目录
cd ..
cp ../test1 ./home/lion/
&
命令作为后台命令执行
用户:命令 &
gw03 test &
表3-3
简单演示如图3-3
图3-3
如图3-3,对图中操作做一个简单的解释。
当前在根目录下,所以pwd命令显示“/”。
使用ls显示“/”目录下的文件信息。
通过cd root 进入root目录,这里因为是用root用户登录的,所以有权限进入,一般用户是无法查看root目录的内容的。
使用mkdir创建目录testdir
使用touch创建一个空文件test.txt
通过ls –l 查看test.txt的详细信息,显示如下
-rw- r- -r- - 1 root root 0 Aug 11 01:30 test.txt
代表的意思分别是:
文件类型+权限 硬链接数(1)该文件拥有者拥有者所在的组文件大小(0字节)最近修改时间文件名
ls –a 显示当前目录下所有文件,包括.号开头的隐藏文件,其中(.)表示当前目录,(..)表示上一层目录。
通过cp命令拷贝,ll显示两者有着相同的信息。
当忘记一个命令的具体用法时,最好的办法其实就是查看linux自带的帮助手册,使用man指令查看,如man ls就会显示ls的具体用法,帮助手册的内容非常全面,网络上大部分的解释其实就是翻译了linux自带帮助手册的内容,所以大家一定要好好利用这个强大的工具,来帮助解决工作中遇到的问题。
Linux文件类型常见的有:普通文件、目录文件、字符设备文件、块设备文件、符号链接文件、管道文件、socket文件等;下面做一个简要的说明:
1 普通文件(-)
1
2
3
|
[root@localhost ~] # ls -lh install.log -rw-r--r-- 1 root root 53K 03-16 08:54 install .log |
我们用 ls -lh 来查看某个文件的属性,可以看到有类似 -rw-r--r-- ,值得注意的是第一个符号是 - ,这样的文件在Linux中就是普通文件。这些文件一般是用一些相关的应用程序创建,比如图像工具、文档工具、归档工具... .... 或 cp工具等。这类文件的删除方式是用rm 命令;
2 目录(d)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
|
[root@localhost ~] # ls -lh 总计 14M -rw-r--r-- 1 root root 2 03-27 02:00 fonts.scale -rw-r--r-- 1 root root 53K 03-16 08:54 install .log -rw-r--r-- 1 root root 14M 03-16 07:53 kernel-6.15-1.2025_FC5.i686.rpm drwxr-xr-x 2 1000 users 4.0K 04-04 23:30 mkuml-2004.07.17 drwxr-xr-x 2 root root 4.0K 04-19 10:53 mydir drwxr-xr-x 2 root root 4.0K 03-17 04:25 Public |
当我们在某个目录下执行,看到有类似 drwxr-xr-x ,这样的文件就是目录,目录在Linux是一个比较特殊的文件。注意它的第一个字符是d。创建目录的命令可以用 mkdir 命令,或cp命令,cp可以把一个目录复制为另一个目录。删除用rm 或rmdir命令。
3 字符设备或块设备文件(b或者c)
如果您进入/dev目录,列一下文件,会看到类似如下的;
1
2
3
4
5
6
7
|
[root@localhost ~] # ls -la /dev/tty crw-rw-rw- 1 root tty 5, 0 04-19 08:29 /dev/tty [root@localhost ~] # ls -la /dev/hda1 brw-r----- 1 root disk 3, 1 2006-04-19 /dev/hda1 |
我们看到/dev/tty的属性是 crw-rw-rw- ,注意前面第一个字符是 c ,这表示字符设备文件。比如键盘等串口设备
我们看到 /dev/hda1 的属性是 brw-r----- ,注意前面的第一个字符是b,这表示块设备,比如硬盘,光驱等设备;
这个种类的文件,是用mknode来创建,用rm来删除。
4 socket文件(s)
当我们启动MySQL服务器时,会产生一个mysql.sock的文件。
1
2
3
|
[root@localhost ~] # ls -lh /var/lib/mysql/mysql.sock srwxrwxrwx 1 mysql mysql 0 04-19 11:12 /var/lib/mysql/mysql .sock |
注意这个文件的属性的第一个字符是 s,表示是socket文件。我们了解一下就行了。
5 符号链接文件(l)
1
2
3
|
[root@localhost ~] # ls -lh setup.log lrwxrwxrwx 1 root root 11 04-19 11:18 setup.log -> install .log |
当我们查看文件属性时,会看到有类似 lrwxrwxrwx,注意第一个字符是l,这类文件是链接文件。是通过ln -s 源文件名新文件名。上面是一个例子,表示setup.log是install.log的软链接文件。怎么理解呢?这和Windows操作系统中的快捷方式有点相似。
符号链接文件的创建方法举例;
1
2
3
4
5
6
7
8
9
10
11
|
[root@localhost ~] # ls -lh kernel-6.15-1.2025_FC5.i686.rpm -rw-r--r-- 1 root root 14M 03-16 07:53 kernel-6.15-1.2025_FC5.i686.rpm [root@localhost ~] # ln -s kernel-6.15-1.2025_FC5.i686.rpm kernel.rpm [root@localhost ~] # ls -lh kernel* -rw-r--r-- 1 root root 14M 03-16 07:53 kernel-6.15-1.2025_FC5.i686.rpm lrwxrwxrwx 1 root root 33 04-19 11:27 kernel.rpm -> kernel-6.15-1.2025_FC5.i686.rpm |
Linux的文件目录结构就像一颗树,它是由/(根)开始往下发展的。Linux把不同文件系统挂载在根文件系统下不同的子目录上,用户可以从根目录开始方便找到存放在不同文件系统的文件。而windows操作系统的每个文件系统以逻辑盘符形式给用户,例如C盘、D盘等。目录结构如下:
/ 根目录
│
├boot/ 启动文件。所有与系统启动有关的文件都保存在这里
│└grub/ Grub引导器相关的文件
│
├dev/ 设备文件
├proc/ 内核与进程镜像
│
├mnt/ 临时挂载
├media/ 挂载媒体设备
│
├root/ root用户的$HOME目录
├home/
│├user/ 普通用户的$HOME目录
│└…/
│
├bin/ 系统程序
├sbin/ 管理员系统程序
├lib/ 系统程序库文件
├etc/ 系统程序和大部分应用程序的全局配置文件
│├init.d/ SystemV风格的启动脚本
│├rcX.d/ 启动脚本的链接,定义运行级别
│├network/ 网络配置文件
│├X11/ 图形界面配置文件
│
├usr/
│├bin/ 应用程序
│├sbin/ 管理员应用程序
│├lib/ 应用程序库文件
│├share/ 应用程序资源文件
│├src/ 应用程序源代码
│├local/
││├soft/ 用户程序
││└…/ 通常使用单独文件夹
│├X11R6/ 图形界面系统
│
├var/ 动态数据
│
├tmp/ 临时文件
├lost+found/ 磁盘修复文件
图4-1
在安装linux系统时,系统会建立一些默认的目录(如图4-1),而每个目录都有其特殊功能。下面是linux文件系统一些常用目录功能。
根目录(/)
根目录位于分层文件系统的最顶层,用斜线(/)表示,它包含了所有的目录和文件。
/bin
存放那些供系统管理员和普通用户使用的重要的linux命令的可执行文件。这个目录下的文件要么是可执行文件,要么是其他目录下可执行文件的符号链接。
/boot
存放用户启动linux系统的所有文件,包括linux内核的二进制镜像。
/dev
存放链接到计算机上的设备的对应文件。.
/etc
存放系统配置文件,这个目录下的文件主要由系统管理员使用,普通用户对大部分文件有读权限。
/home
存放一般用户的主目录,每创建一个用户会在该目录下产生一个以用户名为文件名的目录,作为该用户的主目录。
/lib
存放各种编程语言库。典型的linux系统包含C、C++等库文件。目录/lib/modules包含了可加载的内核模块。/lib目录存放了所有重要的库文件,其他的库文件则大部分存储在目录/usr/lib下。
/lost+found
这个目录里边平常是空的,如果文件系统出错,使用 fsck 修复,则坏掉的 inode 就会链接到这个目录。
/mnt
用来临时挂载文件系统,执行mount命令实现对U盘的挂载等。
/opt
主要存放安装的应用程序。
/proc
当前进程和系统的信息,该目录仅保存在内存,这里不做详细介绍。
/root
Root用户的主目录,其他用户的主目录都位于/home目录中,普通用户没有权限访问/root目录。
/sbin
目录/sbin、/usr/sbin和/usr/local/sbin都存放系统管理工具、应用软件和通用的根用户权限的命令。
/tmp
存放临时性的文件,一些命令和应用程序会用到这个目录。你也可以用这个目录来存放你自己的一些临时文件。这个目录下的所有文件会被定时删除,以避免临时文件占满整个磁盘分区。
/usr
/usr目录是linux文件系统中的最大的目录之一。存放用户使用的系统命令以及应用程序等信息。
/var
存放易变数据,这些数据在系统运行过程中会不断地改变。
表4-1
vi编辑器是所有Unix及Linux系统下标准的编辑器,它的强大不逊色于任何最新的文本编辑器,但这需要花很多时间去熟悉它的配置和指令,这里只是简单地介绍一下它的用法和一小部分指令。
基本上vi可以分为三种状态,分别是
命令模式(command mode)
插入模式(Insert mode)
底行模式(last line mode)
1) 命令行模式command mode)
控制屏幕光标的移动,字符、字或行的删除,移动复制某区段及进入Insert mode下,或者到 last line mode。
2) 插入模式(Insert mode)
只有在Insert mode下,才可以做文字输入,按[ESC]键可回到命令行模式。
3) 底行模式(last line mode)
将文件保存或退出vi,也可以设置编辑环境,如寻找字符串、列出行号……等。
不过一般我们在使用时把vi简化成两个模式,就是将底行模式(last line mode)也算入命令行模式command mode)。
模式转换:
图5-1
a) 进入vi
在系统提示符号输入vi及文件名称后,就进入vi全屏幕编辑画面:
$ vi myfile
不过有一点要特别注意,就是您进入vi之后,是处于[命令行模式(command mode)],您要切换到[插入模式(Insert mode)]才能够输入文字。初次使用vi的人都会想先用上下左右键移动光标,结果电脑一直哔哔叫,把自己气个半死,所以进入vi后,先不要乱动,转换到 [插入模式(Insert mode)]再说吧!
b) 切换至插入模式(Insert mode)编辑文件
在[命令行模式(command mode)]下按一下字母i就可以进入[插入模式(Insert mode)],这时候你就可以开始输入文字了。
c) Insert 的切换
您目前处于[插入模式(Insert mode)],可以按一下[ESC]键转到[命令行模式(command mode)]。
d) 退出vi及保存文件
命令行模式下保存并退出:输入ZZ
在[命令行模式(command mode)]下,按一下[:]冒号键进入[Last line mode],例如:
: w filename (输入 [w filename]将文章以指定的文件名filename保存)
: wq (输入[wq],存盘并退出vi)
: q! (输入q!,不存盘强制退出vi)
:x (执行保存并退出vi编辑器)
Vi的快捷方式和增强功能有很多,这里只是介绍最简单的用法,如果想要提高开发效率,研究下vi的高级功能还是很有必要的,这里就不做介绍了。
命令模式下的命令:
命令
解释
命令
解释
:x
保存之后退出
a
在当前位置之后添加
:wq
保存之后退出
i
在当前的位置前面插入
:w
保存文件
o
在当前行的下面建一个新行
:q
退出
O
在当前行的上面建一个新行
:q!
不存盘就退出
数字G
跳至第“数字”行(无数字时跳到文件末尾)
:set number
在每行开始显示行数
数字yy
复制多少行(无数字时复制光标行)
h
光标左移
数字dd
删除多少行(无数字时删除光标行)
j
光标下移
p
在当前行的下面粘贴
k
光标上移
u
撤消上一次的命令操作(可撤销多次操作)
l
光标右移
D
从光标位置删除到本行行末
0
光标移到本行的开头
x
删除当前字符
$
光标移到本行的末尾
X
删除前一个字符
表5-1
Gcc是linux系统下应用最广泛的C编译器,下面通过一个简单的例子演示gcc的使用。
图6-1
图6-2
写完程序后运行 gcc hello.c –o hello,竟然发现没有系统找不到gcc,原因是redhat安装时默认没有安装gcc编译器,但是安装文件在光盘镜像里还是有的,所以这里打开光盘镜像,操作如下
Vm-setting
图6-3
点击确定,桌面上出现光盘镜像的图标
图6-4
Shell中进入/media/RHEL_5.5 i386 DVD/Server
运行rpm -ivh gcc-4.1.2-48.el5.i386.rpm,出现如图6.5的错误提示,提示需要先安装对应的依赖文件,这些依赖文件也都是在该目录下,所以就按照提示安装所需的依赖文件就行了。
图6-5
最后总结的安装gcc时所需要安装的包如下,按顺序安装就可以
rpm -ivh kernel-headers-2.6.18-194.el5.i386.rpm
rpm -ivh glibc-headers-2.5-49.i386.rpm
rpm -ivh glibc-devel-2.5-49.i386.rpm
rpm -ivh libgomp-4.4.0-6.el5.i386.rpm
rpm -ivh gcc-4.1.2-48.el5.i386.rpm
顺便把g++也安装了
rpm -ivh libstdc++-devel-4.1.2-48.el5.i386.rpm
rpm -ivh gcc-c++-4.1.2-48.el5.i386.rpm
装完后就可以正常使用gcc编译程序了
图6-6
其中-o hello 表示生成的可执行文件命名为hello。
虽然linux下的文件没有后缀名的概念,但是gcc对文件名有一定的规则:
.c为后缀的文件,C语言源代码文件;
.a为后缀的文件,是由目标文件构成的档案库文件;
.C,.cc或.cxx 为后缀的文件,是C++源代码文件且必须要经过预处理;
.h为后缀的文件,是程序所包含的头文件;
.i 为后缀的文件,是C源代码文件且不应该对其执行预处理;
.ii为后缀的文件,是C++源代码文件且不应该对其执行预处理;
.m为后缀的文件,是Objective-C源代码文件;
.o为后缀的文件,是编译后的目标文件;
.s为后缀的文件,是汇编语言源代码文件;
.S为后缀的文件,是经过预编译的汇编语言源代码文件。
GCC最基本的用法是∶gcc [options] [filenames]
其中options就是编译器所需要的参数,filenames给出相关的文件名称。
-c,只编译,不连接成为可执行文件,编译器只是由输入的.c等源代码文件生成.o为后缀的目标文件,通常用于编译不包含主程序的子程序文件。
-o output_filename,确定输出文件的名称为output_filename,同时这个名称不能和源文件同名。如果不给出这个选项,gcc就给出预设的可执行文件a.out。
-g,产生符号调试工具(GNU的gdb)所必要的符号资讯,要想对源代码进行调试,我们就必须加入这个选项。
-O,对程序进行优化编译、连接,采用这个选项,整个源代码会在编译、连接过程中进行优化处理,这样产生的可执行文件的执行效率可以提高,但是,编译、连接的速度就相应地要慢一些。
-O2,比-O更好的优化编译、连接,当然整个编译、连接过程会更慢。
Shell脚本与Windows/Dos下的批处理相似,也就是用各类命令预先放入到一个文件中,方便一次性执行的一个程序文件,主要是方便管理员进行设置或者管理用的。看懂shell脚本文件对理解linux环境下各个软件的配置有很大的帮助。这里不介绍具体的流程控制语法细节,只是很简单地介绍下shell脚本的几个关键内容,帮助大家建立这么一个概念。
1 开头
程序必须以下面的行开始(必须方在文件的第一行):
#!/bin/sh
符号#!用来告诉系统它后面的参数是用来执行该文件的程序。在这个例子中我们使用/bin/sh来执行程序。
当编辑好脚本时,如果要执行该脚本,还必须使其可执行。
要使脚本可执行:
编译 chmod +x filename 这样才能用./filename 来运行
2 注释
在进行shell编程时,以#开头的句子表示注释,直到这一行的结束。
3 变量
在其他编程语言中您必须使用变量。在shell编程中,所有的变量都由字符串组成,并且您不需要对变量进行声明。要赋值给一个变量,您可以这样写:
#!/bin/sh
#对变量赋值:
a="hello world"
# 现在打印变量a的内容:
echo "A is:"
echo $a
有时候变量名很容易与其他文字混淆,比如:
num=2
echo "this is the $numnd"
这并不会打印出"this is the 2nd",而仅仅打印"this is the ",因为shell会去搜索变量numnd的值,但是这个变量时没有值的。可以使用花括号来告诉shell我们要打印的是num变量:
num=2
echo "this is the ${num}nd"
这将打印: this is the 2nd
4 环境变量
由export关键字处理过的变量叫做环境变量。这里再介绍下系统的环境变量,如PATH变量,我们编写的脚本和其他的可执行程序,在我们执行他的时候,系统会在PATH变量中列出的每个目录下依次寻找该程序,若找不到则会提示错误信息,这就是为什么当前目录下的hello文件要用./hello 运行,而不能直接hello运行的原因。那解决的办法也很简单,就是在PATH变量中加入目录(.)。
PATH =$PATH:.
下面是简单的脚本编写例子:
例子1:
图7-1
图7-2
写完的脚本要注意加上可执行权限才能运行。
例子2:
图7-3
图7-4
例子2中将执行hello的输出重定向到tempout文件中,关于重定向的使用请参考第三章。echo答应出变量msg中的值,记得带$符号,如果写成echo msg则会把msg当做字符串看待,只是输出”msg”而已。
编写脚本是linux系统管理员的主要工作,shell脚本的功能和效率不逊色于C语言,其语法也是比较复杂的,这里不介绍流程控制和函数之类的内容,对于大多数人来说只要看懂脚本就可以了,具体的语法可以在需要时再查看。
Makefile的作用是使代码的编译能自动完成,我们小的程序也许只需要
gcc filename –o file.out一条语句,但是如果是一个庞大的项目,源代码之间的依赖关系就很会很复杂,每一次编译都写很复杂的编译语句是不现实的,所以linux下采用makefile描述这种依赖关系,控制代码的编译过程。下面以一个简单的例子讲解下makefile的基本语法和使用。
准备三个文件:file1.c, file2.c, file2.h
file1.c:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
|
#include <stdio.h> #include "file2.h" int main() { printf ( "hello " ); File2Print(); return 0; } |
file2.h:
1
|
void File2Print(); |
file2.c:
1
2
3
4
5
6
7
8
9
|
#include "file2.h" void File2Print() { printf ( "world!\n" ); } |
=== makefile 开始 ===
helloworld:file1.o file2.o
gcc file1.o file2.o -o helloworld
file1.o:file1.c file2.h
gcc -c file1.c -o file1.o
file2.o:file2.c file2.h
gcc -c file2.c -o file2.o
clean:
rm -rf *.o helloworld
=== makefile 结束 ===
一个 makefile 主要含有一系列的规则,如下:
A: B
(tab)<command>
(tab)<command>
每个命令行前都必须有tab符号。
上面的makefile文件目的就是要编译一个helloworld的可执行文件。让我们一句一句来解释:
helloworld : file1.o file2.o: helloworld依赖file1.o file2.o两个目标文件。
gcc File1.o File2.o -o helloworld: 编译出helloworld可执行文件。-o表示你指定 的目标文件名。
file1.o : file1.c: file1.o依赖file1.c文件。
gcc -c file1.c -o file1.o: 编译出file1.o文件。-c表示gcc 只把给它的文件编译成目标文件,用源码文件的文件名命名但把其后缀由“.c”或“.cc”变成“.o”。在这句中,可以省略-o file1.o,编译器默认生成file1.o文件,这就是-c的作用。
file2.o : file2.c file2.h
gcc -c file2.c -o file2.o
这两句和上两句相同。
clean:
rm -rf *.o helloworld
当用户键入make clean命令时,系统会寻找makefile文件中clean下的内容并执行,这里会删除*.o 和helloworld文件。
如果要编译cpp文件,只要把gcc改成g++就行了。
写好Makefile文件,在命令行中直接键入make命令,系统就会默认找到当前目录下得makefile文件作为执行对象,当然也可以通过make filename执行以其它名字命名的makefile文件。
上面提到一句,如果要编译cpp文件,只要把gcc改成g++就行了。但如果Makefile中有很多gcc,那不就很麻烦了,所以一下对makefile做下改进。
=== makefile 开始 ===
OBJS = file1.o file2.o
CC = gcc
CFLAGS = -Wall -O -g
helloworld : $(OBJS)
$(CC) $(OBJS) -o helloworld
file1.o : file1.c file2.h
$(CC) $(CFLAGS) -c file1.c -o file1.o
file2.o : file2.c file2.h
$(CC) $(CFLAGS) -c file2.c -o file2.o
clean:
rm -rf *.o helloworld
=== makefile 结束 ===
这里我们应用到了变量。要设定一个变量,你只要在一行的开始写下这个变量的名字,后面跟一个 = 号,后面跟你要设定的这个变量的值。以后你要引用 这个变量,写一个 $ 符号,后面是围在括号里的变量名。
CFLAGS = -Wall -O –g,解释一下。这是配置编译器设置,并把它赋值给CFFLAGS变量。
-Wall: 输出所有的警告信息。
-O: 在编译时进行优化。
-g: 表示编译debug版本。
通过上面的介绍,应该了解了基本的makefile语法规则和原理,正规的makefile可以设计的非常灵活,其中会使用各种变量和函数等实现代码编译的自动化。一般我们需要的只是能看懂makefile文件,并能根据编译错误对文件做适当的修改,而这些错误一般集中在头文件和库文件包含目录、编辑选项等,只要仔细观察错误信息,一般的问题应该都能自己解决了。