Linux自学手册

 

Linux基础自学手册

 

 

 

 

目录

内容简介

一、vmware虚拟机的使用

二、redhat操作系统

2.1安装redhat

2.2 设置文件夹共享

三、终端的介绍与使用

3.1 shell的介绍

3.2 linux基本命令

四、文件目录结构的介绍

4.1文件类型介绍

4.2 文件目录结构介绍

五、vim编辑器的使用

5.1 vi的基本概念

5.2 vi的基本操作

六、gcc编译工具使用

6.1 Redhat下gcc的安装

6.2 gcc的使用

七、脚本基本语法

八、makefile文件理解与修改

 

 

 

 

 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文件做一个简单介绍,希望达到看懂文件并能准确修改以解决工作问题的目的。

由于水平有限,文章中难免会有许多的错误,希望和大家一起讨论,共同进步。

 

 

 

一、vmware虚拟机的使用

在虚拟机没有流行之前,人们要想在日常中使用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安装redhat

现在安装操作系统步骤都非常简单,基本都下一步就可以了,而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

2.2 设置文件夹共享

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

 

三、终端的介绍与使用

3.1 shell的介绍

虽然如前面看到的,现在的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.2 linux基本命令

 

图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自带帮助手册的内容,所以大家一定要好好利用这个强大的工具,来帮助解决工作中遇到的问题。

 

 

 

四、文件目录结构的介绍

4.1文件类型介绍

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

 

 

4.2 文件目录结构介绍

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

 

 

 

五、vim编辑器的使用

vi编辑器是所有Unix及Linux系统下标准的编辑器,它的强大不逊色于任何最新的文本编辑器,但这需要花很多时间去熟悉它的配置和指令,这里只是简单地介绍一下它的用法和一小部分指令。

5.1 vi的基本概念

基本上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

5.2 vi的基本操作

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编译工具使用

6.1 Redhat下gcc的安装

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。

6.2 gcc的使用

 虽然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文件理解与修改

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文件,并能根据编译错误对文件做适当的修改,而这些错误一般集中在头文件和库文件包含目录、编辑选项等,只要仔细观察错误信息,一般的问题应该都能自己解决了。

posted on 2016-06-13 09:24  Samboo  阅读(403)  评论(0编辑  收藏  举报

导航