标签(空格分隔): Linux
Author:atao
[补充]
清屏
- Ctrl + l
- clear
查看linux版本信息
uname -a
挂载nfs(网络文件)的方法
##1. 挂载
格式:mount -t nfs 网络地址:/共享目录 要挂载到的目录
mount -t nfs 192.168.1.150:/home/jacky/ET05_linux_program /home/nfs
##2. 卸载
格式:umount 已挂载的目录
umount /home/nfs
##3.共享时设权限
vim /etc/exports
修改内容为:/home/jacky/ET05_linux_program/*(ro)
进程管理命令
• top 动态显示系统中的进程
• kill 终止进程
• CTRL+C 终止正在运行的进程
• CTRL+Z悬挂正在运行的进程
• jobs 显示后台和停止的进程
• bg %任务号 将悬挂进程在后台继续运行
• fg %任务号 将悬挂进程/后台进程转到前台
• /proc/<进程编号>
//这是一个虚拟目录,下面各个文件表示进程各种情息,可以用cat 查看
//比如1号进程,可以用查看各种状态 cat /proc/1/status
进程编程
• 常见进程控制函数
– fork – 创建一个新进程
– exec – 用一个新进程去执行一个命令行
– exit – 正常退出进程
– abort – 非正常退出一个进程
– kill – 杀死进程或向一个进程发送信号
– wait – 等待子进程结束
– sleep – 将当前进程休眠一段时间
– getpid – 取得进程编号
– getppid – 取得父进程编号
一、代码查看器
• SourceInsight软件
用法:1,先建工程(project),工程名一般用英文,路径一般设为与查看的文件在同一个目录(如:myApp/pro)
2,选择源码的路径(如:myApp)
3,同步文件.右击点SynchronizeFiles,或者点菜单栏的“书”图标,点击后默认选项就可以.
二、gcc
用法:1,格式,gcc -o 输出文件名 输入文件名
2,复制,cp [参数] 源文件名 目标文件名
三、远程连接工具
1.Winscp
2.SecureCRT
四、常用命令
1.mkdir 创建新目录
参数:-p //可以实现在新目录下再创建新目录
-m 777 //设置权限
2.rmdir 删除目录
• rmdir 目录名 //删除指定目录
3.touch 创建文件
参数:touch "带空格的文件名"
//不带双引号则创建两个文件,不建议带空格的文件名
压缩/解压命令
1. tar 打包/压缩命令
1)tar常用参数
• -c 创建tar 文件
• -r 代替一个tar文件里内容
• -f 将文件打包生成到一个文件里
如:tar –cvf new.tar /home/atao
//表示将atao目录打包压缩到new.tar压缩文件里
• -v 详细显示处理过程
• -x 对tar 进行解包
如:tar –xvf new.tar /home
//表示将将new.tar解压到/home目录下
• -z 用 gzip 对存档压缩或解压
• -j 用bzip2 来解压缩
• -t 显示tar文件里的文件名
• -C 指定要解压到的目录
2)常用组合
• 压缩
tar cvzf/cvjf 压缩包名.tar.gz 要压缩的文件/目录
• 解压
tar xvzf/xvjf 压缩包 -C 要解压到的目录
2. gzip [要压缩的文件]
//注意:这个命令只能压缩文件,不能压缩目录,并且不保留原文件
功能描述:将指定的文件压缩为*.gz
eg#:gzip text.c //将text.c压缩,并创建为text.c.gz
3. gunzip [要解压的文件]
//注意:这个命令只能解压文件,不能解压目录
功能描述:将指定的*.gz压缩文件解压
eg#:gunzip text.gz //将text.gz压缩文件解压
4. zip [-r] [压缩后的文件名] [要压缩的文件/目录]
功能描述:压缩文件或目录(加-r选项表示是压缩目录)
eg1#:zip -r demo.zip demo //将目录demo压缩为demo.zip
eg2#:zip text.zip text.c //将文件text.c压缩为text.zip
5. unzip [压缩文件.zip]
功能描述:将压缩文件.zip解压
eg#:unzip demo.zip
6. bzip2 [-k] [文件]
功能描述:压缩文件(-k选项表示压缩后保留原文件)为*.bz2
eg#:bzip2 -k main.c //将main.c压缩为main.c.bz2
7. bunzip2 [压缩文件.bz2]
功能描述:将压缩文件.bz2解压
eg#:bunzip2 main.c.bz2 //将main.c.bz2文件解压
查看文件命令
1. cat 文件名 //查看文件内容(只适合内容不多的文件)
• 参数:-n //查看内容的同时还显示行号
-b或--number-nonblank 和 -n 相似,只不过对于空白行不编号
-s或--squeeze-blank连续两行以上的空白行,代换为一行的空白行
• cat 实例
1) cat hello.txt //显示hello.txt 内容
2) cat hello1.txt hello2.txt > hello3.txt
//把hello1.txt内容与hello2.txt内容合并,输出到hello3.txt中
3) cat -n textfile1 > textfile2
//把 textfile1 的档案内容加上行号后输入 textfile2 这个档案里
4) cat -b textfile1 textfile2 >> textfile3
//把 textfile1和textfile2的档案内容加上行号(空白行不加)之后将内容附加到 textfile3 里。
2. tac 文件名 //倒着显示文件内容(命令也很有意思,就是cat倒着输入)
3. more 文件名 //查看文件内容
参数:(空格)或f ---> 翻页
(Enter) ---> 换行
+/搜索词 --->表示从搜索词的地方开始显示
-数字 --->每屏显示的行数
4. ls 查看目录文件信息
1)-a 显示指定目录下所有子目录与文件,含隐藏文件。
2)-A 显示指定目录下所有子目录与文件,含隐藏文件。但不列出 “.”和 “..”。
3)-c 按文件的修改时间排序。
4)-C 分成多列显示各项。
5)-d 如果参数是目录,只显示其名称而不显示其下的各文件。往往与l选项一起使 用,以得到目录的详细信息。
6)-i 在输出的第一列显示文件的i节点号。
7)-l 以长格式来显示文件的详细信息。
8)-R 递归式地显示指定目录的各个子目录中的文件。
9)-s 给出每个目录项所用的块数,包括间接块。
eg:ls -i 文件名 //查看文件的id节点编号
q或Q --->退出
5. less 文件名 //分页显示文件内容(可向上翻页)
参数: (pgup键)或上 --->向上翻页
/搜索词 --->还可查找搜索词
//当查找到搜索词时可以继续按“n”向上查看
6. head 文件名 //默认显示文件前10行内容
参数: -n 指定行数
7. tail 文件名 //默认显示文件后10行内容
参数: -n 指定行数
-f 动态显示文件末尾内容 -->意思是记录会不断更新显示
8. chmod修改权限
命令:chmod {augo}{rwx} 文件名 如:chmod -R 4777 demo1
参数:-R 递归
4--->setUID //按照所有者的权限访问文件
2--->setGID //按照所属组的权限访问文件
其中: 4--可读(r) 2--可写(w) 1--可执行(x)
组合代表的用户:所有者 所属组 其它人
9. 修改文件/目录的所有者
命令:chown 用户 文件或目录
//将文件或目录的所有者改为要设置的用户
例如:chown atao demo1
10. 修改文件/目录的所属组
命令:chgrp 用户组 文件或目录
//将文件或目录的所属组改为要设置的组
11. umask -S //显示、设置文件的缺省权限
• 设置权限方法
eg:777 rwx rwx rwx //先把所有权限写出来
rwx r-x r-x //然后写出想设置成的权限
得出设置值:022 //做出^(异或运算)
开始设置:#:umask 022 //将权限设置成了755
文件查找命令
1.find实时查找文件
命令:find 搜索范围 -name 文件名 //文件搜索命令
参数:
• -name 按照文件名查找文件。
• -type
查找某一类型的文件,诸如:
– b - 块设备文件。
– d - 目录。
– c - 字符设备文件。
– p - 管道文件。
– l - 符号链接文件。
– f - 普通文件。
- perm - 权限
如:find /home -name main.c //在home目录下搜索main.c文件
又如:find /home -name *main*
//只要有包含main的文件都能被搜索到--->*文件名*
eg1:find /home -name mai? //精确查找--->加?号
eg2:find /home -iname main //-iname 不区分大小写字母
eg3:find /home -size +204800 //根据文件大小查找
eg4: find . -type f //根据文件类型查找文件
eg5: find -perm 777 //根据权限查找文件
参数1: +数字--->大于 +数字--->小于 数字--->等于
注意: 1数据块 = 512字节 = 0.5K
100MB = 102400KB = 204800
参数2:-user 所有者名 //在目录下查找所有者为所有者名的文件
-group 所属组名 //在目录下查找所属组为所属组名的文件
参数3:-amin 访问时间
//-amin -5 => 查找5分钟内被修改过属性的文件和目录
-cmin 文件属性
-mmin 文件内容
参数4:-a //即and,意思是两个条件同时满足
-o //即or,两个条件满足任意一个即可
参数5:-exec/ok ls -l {} \;
//对搜索出来的文件进行详细显示
参数6:-type //根据文件类型查找
其中:f->一般文件 d->目录 l->软链接文件
如:find /home -name mai* -a -type d
参数7:-inum 节点号 //根据i节点查找
2.locate智能快捷定位查找文件,需要更新文件资料库,不然新建的文件查找不到
命令:locate 文件名 回车
参数:-i //不区分大小写
更新文件资料库命令:updatedb 回车 //手动更新文件资料库
3.删除文件 (带空格的文件)
方法一、rm -f ni\ hao 回车 //删除“ni hao”带空格的文件
方法二、rm -f "ni hao"
方法三、find . -inum 节点号 -exec rm {} \;
或者:find . -inum 节点号 -ok rm {} \;
4.mv 移动和修改文件名
5.rm 删除
• 参数含意
1)-r 递归删除, 删除一个完整目录及其子目录
2)-f 不询问直接删除
3)-d 表示删除目录
4)-i 询问确认的选项,这是rm命令默认参数,知道就行
• 一般组合使用,快速删除一个目录
rm –rfd mydir
6.cp 复制
命令:cp -rp 原文件或目录 目标目录
参数:-r 复制目录 -p 保留文件属性 + 同步更新
如:cp -p + 文件名 //拷贝的同时保存该文件的属性,相当于硬链接
• 语法: cp [选项] 源文件或目录 目标文件或目录
//从源文件拷贝到目标文件或路径
• 常用选项含义如下:
1、-d 拷贝时保留链接。
2、-f 覆盖已经存在的目标文件而不提示。
3、-i 要提示要求用户确认。
4、-R 若给出的源文件是一目录文件,此时cp将递归复制该目
录下所有的子目录和文件。此时目标文件必须为一个目录名。
5、-b生成已存在目标文件的覆盖之前备份
6、-a 该选项通常在拷贝目录时使用。它保留链接、文件属性,
并递归地拷贝目录,其作用等于dpR选项的组合。
• cp支持文件名通配符
1)*任意字符文件
• cp *.conf /home
//拷贝当前目录下所有以.conf结尾的文件到/home目录
2)?,代表一个字符
7.which 搜索命令所在的位置
• 语法结构:which 命令
功能描述:搜索命令所在目录及别名信息
eg:which cp //查找cp命令所在的目录
8.whereis 搜索命令
• 语法结构:whereis 命令
功能描述:搜索命令所在的目录及帮助文档路径
eg:whereis touch
文本查找命令
1.grep 查找文本内容所在的文件
• 命令参数
1、-r 表示不仅在当前目录查询,而且还可查询子目录
2、-i 不区分大小写
3、-l 只列出匹配的文件名
4、-w 匹配整个单词.
5、-v 排除指定字符串
eg#:grep -iv 字符串 文件
比如:grep -v ^# /etc/inittab //查找文件时排除注释行
其中:字符^后面跟字符->表示以某某字符开头的行
• grep实例
@ 查找某个目录下包含关键字的文件
grep –r 要查找的文件内容 查询路径
eg:grep –r abc /home/atao/*
//查找目录下/home/atao/所有文件,把包含abc的文件内容在屏幕上显示
@ Grep 的一个重要作用是通过管道用于过滤命令输出的结果
ps –a | grep smbd
@把命令ps –a的结果过滤,查找包含smbd的内容
@ Grep 采用正则表达式的匹配机制
1)$ ls -l | grep ‘^a’
//通过管道过滤ls-l输出的内容,只显示以a开头的行。
2)$ grep ‘[a-z]{5}’ aa //显示aa文件所有包含每个字符串至少有5个连续小写字符的字符串的行。
目录文件命令
1.ln文件链接(相当于快捷方式)
• 软链接
命令:ln -s 源文件/目录 目标文件/目录
//相当于给源文件创建了一个快捷方式,id节点号与源文件不同
• 硬链接
命令:ln 源文件/目录 目标文件/目录
//相当于创建了一个快捷方式和复制了这个文件,id节点与源相同
查看帮助命令
- man [命令或配置文件]
功能描述:获得帮助信息
eg#:man mkdir //查看mkdir命令的使用帮助
其它选项:1 表示查看的是命令的帮助 5 表示查看的配置文件的帮助
eg#:man 5 passwd //查看的是passwd配置文件的帮助 - whatis [命令]
功能描述:只查看某一命令是干什么用的
eg#:whatis ls //查看ls命令是干什么用的
3.apropos [配置文件]
功能描述:只查看某一配置文件的作用
eg#:apropos services //查看services配置文件的作用 - [命令] --help
功能描述:查看命令有哪些选项并对应的功能
eg#:touch --help //查看touch有哪些选项 - help [命令]
功能描述:查看shell内置命令的帮助信息
eg#:help cd //查看cd的帮助信息
用户管理命令
- useradd [用户名]
功能描述:添加用户名
eg#:useradd atao //添加了一个atao的新用户 - passwd [用户名]
功能描述:添加用户密码
eg#:passwd atao //表示将要为atao设置一个密码 - who
功能描述:查看用户登录信息
eg#:who
执行后会显示的结果:
登录的用户名 登录的终端(tty本地终端 pts远程终端) 登录时间 IP - w
功能描述:查看登录用户的详细信息
eg#:w
五、系统查询命令
1.ps查看系统激活进程
• 语法: ps [option]
• ps 的参数说明
– ps 提供了很多的选项参数,常用的有以下几个:
– l 长格式输出;
– u 按用户名和启动时间的顺序来显示进程;
– j 用任务格式来显示进程;
– f 用树形格式来显示进程;
– a 显示所有与终端关联的用户进程;
– e 显示所有进程
– x 显示无控制终端的进程;
– r 显示运行中的进程;
– ww 避免详细参数被截断;
• 最常用是aux 或 el
#: ps -aux
注意:
ps-aux 或 lax 输出的解释
• USER 进程的属主;
• PID 进程的ID;
• PPID 父进程;
• %CPU 进程占用的CPU百分比;
• %MEM 占用内存的百分比;
• NI 进程的NICE值,数值大,表示较少占用CPU时间;
• VSZ 进程虚拟大小;
• RSS 驻留中页的数量;
• TTY 终端ID
• STAT 进程状态(有以下几种)
1)WCHAN 正在等待的进程资源;
2)START 启动进程的时间;
3)TIME 进程消耗CPU的时间;
4)COMMAND 命令的名称和参数;
其中:
• ps STAT 进程状态
1)D 无法中断的休眠状态(通常 IO 的进程);
2)R 正在运行可中在队列中可过行的;
3)S 处于休眠状态;
4)T 停止或被追踪;
5)W 进入内存交换(从内核2.6开始无效);
6)X 死掉的进程(从来没见过);
7)Z 僵尸进程;
2.top 动态查看进程状态
• 语法: top [-] [d delay] [q] [c] [s] [S]
• 参数
1、d 指定每两次屏幕信息刷新之间的时间间隔。当然用户可以
使用s交互命令来改变之。
2、q 该选项将使top没有任何延迟的进行刷新。如果调用程序有
超级用户权限,那幺top将以尽可能高的优先级运行。
3、S 指定累计模式。
4、s 使top命令在安全模式中运行。这将去除交互命令所带来的
潜在危险。
5、i 使top不显示任何闲置或者僵死进程。
6、c 显示整个命令行而不只是显示命令名
• 实例:
1、top
2、top –d 5 #间隔5秒刷新
3.df 查看文件系统空间
• 语法: df [option]
df 命令是报告文件系统空间使用情况最可靠的命令
• 命令行参数
1、a:显示全部的档案系统和各分割区的磁盘使用情形
2、i:显示i -nodes的使用量
3、k:大小用k来表示 (默认值)
4、t:显示某一个档案系统的所有分割区磁盘使用量
5、x:显示不是某一个档案系统的所有分割区磁盘使用量
6、T:显示每个分割区所属的档案系统名称
7、H:使用「Human-readable」的输出,也就是在档案系统大小使用
GB、MB 等易读的格式
• 实例
df -hi
4.du计算文件或目录占用空间
• 语法 du [option] [目录/文件]
这是快快速检查文件占用情况的稳定工具
• 命令选项
1、a:显示全部目录和其次目录下的每个档案所占的磁盘空间
2、b:大小用bytes来表示 (默认值为k bytes)
3、c:最后再加上总计 (默认值)
4、s:只显示各档案大小的总合
5、x:只计算同属同一个档案系统的档案
6、L:计算所有的档案大小
• 实例
du -a
5.free 显示内存状态
• 语法: free [-bkmotV][-s <间隔秒数>]
free指令会显示内存的使用情况,包括实体内存,虚拟的交换文
件内存,共享内存区段,以及系统核心使用的缓冲区等。
• 命令选项
1、-b 以Byte为单位显示内存使用情况。
2、-k 以KB为单位显示内存使用情况。
3、-m 以MB为单位显示内存使用情况。
4、-o 不显示缓冲区调节列。
5、-s<间隔秒数> 持续观察内存使用状况。
6、-t 显示内存总和列。
7、-V 显示版本信息。
• 示例
1、free
2、free –s 2
6.man 查看命令联机帮助
• 语法: man [option] <关键字>
manual(手册)的缩写,man相当于Windows的帮助文件
• 命令选项
1、-a 查询所有同名的命令或系统调用,
2、-w 显示联机帮助对应的文本文件名
3、如果是数字,表示查询的版本.
• man 实例
1、 man read
查询read为关键字的联机文档,如果有多个结果,只显示第一个结果
2、 man –a read
1)、查询所有以read为关键字的命令或系统调用
2)、比如read,即是一个命令又是一个系统调用,如果只是man read,每
次只能查到第一个联机,如果想看后面的,可以上述命令,查到第一个,
按q退出,显示就是第二个查询结果
3、 man –aw read
查询所有read相关的信息对应的帮助文件名
4、 man 2 read
直接查询read的第二个联机帮助
• man的交互操作
man在进入查询结果,可以类似vi的末行操作,可以在屏幕最后一行输入一些命令,作简单交互操作.
1、[q] 退出;
2、[Enter] 一行行地下翻;
3、[Space] 一页页地下翻;
4、[b] 上翻一页;
5、[/] 后跟一个字符串和[Enter]来查找字符串;
• /write #在文档中查找write关键字
6、[n] 发现上一次查找的下一个匹配。
使用频率最高一些命令
• ls –l //查看文件/目录详细信息
• rm –rf mydir //强制删除mydir目录
• rm –f //强制删除
• tar xvzf //解压
• tar cvzf //压缩
• mv //移动、重命名文件/目录
• cd //切换目录
• chmod //修改权限
• grep //文本内容查找
• find //搜索命令
• df //查看文件系统占用空间
• free //查看内存
• ifconfig eth0 ip地址 //修改ip地址
• ping //检查网络连通性
• ps –aux (-el) //查看进程
• man //查询帮助
六、shell脚本(.bash/.sh)
- 用cat /etc/shells可以显示系统安装的Shell.
- shell是一个可以一次性执行的可执行文件,即*.sh //相当于*.bat
- 脚本格式
1)shell脚本必须为Unix文本文件
2)shell脚本的第一句必须指定解释的shell或者空行
• 通常固定格式为:#!/bin/sh
• #号及其后面跟随的同一行的所有内容都被忽略
3)shell脚本必须有可执行权限
4)$,*,\’,\是脚本保留字符,要使用需用右斜杠
5)#语句 //#号就是注释的意思 - 变量类型
1)系统变量
2)环境变量
3)自定义变量
eg:
myfile="123" #给myfile变量赋值
echo ${myfile} #输出myfile的值
变量特点:
1)所有变量不用定义可以直接使用
2)所有变量值都是字符类型
- 注意’字符串’和 “字符串” 意义不同
echo ‘字符串’ #’'里的字符串按原样输出
echo “字符串” #""里的字符串若是变量即输出值,无则原样输出 - 自定义变量
var=12
echo ${var:-13} #-表示空值置换
#输出:12
#相当于:var==NULL ? 13 : var
#如果var的值为空,则输出13其中var的值没变,否则为var的值
========其它表达式的含义======
echo ${var:=value} //空值置换,若为空则给var赋值并输出
echo ${var:?} //空值出错,若为空显示系统提示的错误信息
echo ${var:?"err"} //若为空,则显示自定义的提示的错误信息
echo ${var:+value} //有值置换,若有值则输出置换后的值
- 环境变量
//shell 环境变量是所有shell 程序都会接收的参数。
1)PATH 命令搜索路径,以冒号为分隔符.注意与DOS下不同的是,当前目录不在系统路径里
2)HOME 用户home目录的路径名,是cd命令的默认参数
3)IFS 定义SHELL使用的分隔符 ,指命令行参数分隔符IFS=$’ \t\n’
4)LOGNAME 用户登录名
5)SHELL SHELL的路径名
6)TERM 终端类型 LD_LIBRARY_PATH 寻找库的路径,以冒号分隔
用法:(直接在终端下操作)
export LOGNAME //自定义一个环境变量
echo LOGNAME //输出当前的用户登录名
输出:root //当前用户是是哪个用户就输出哪个用户名
其它用法:
1)export PATH=/home/atao:$PATH //将目录添加到了环境变量路径中
2)unset 变量名 //取消该定义的变量
【补充】
1)export //表示设置指定的环境变量
2)unset //用于取消环境变量和自定义的变量
8. 常用系统变量
$n $1表示第一个参数 $2表示第二个参数 ...
$# 显示命令行参数的个数
$0 显示当前程序的名称
$? 前一个命令或函数的返回值
$* 以"参数1 参数2 ..."形式保存所有参数
$@ 以"参数1" "参数2" ... 形式保存所有参数
$$ 本程序的(进程ID号)PID
$! 上一个命令的PID
用法:echo "$$"
- 表达式的运算达
格式:$((表达式))
eg: echo $((1 + 3)) #输出:4
*其中两种不同的将字符串当成数学表达式的关键字//let和expr
1)let num=1+3
echo $num #输出:4
2)num=`expr 1 + 3`
echo $num #输出:4
#注意:`这个字符是Esc键下的那个字符,不是单引号.
- $(())支持多进制的表示
八进制$((08))
十六进制$((0x16)) - $((进制数#数字))任意进制的表示
echo $((2#1101010)) #2进制表示
echo $((8#377)) #8进制表示
echo $((16#D8)) #16进制表示
echo $((12#10)) #12进制表示
echo $((36#ZZYY)) #36进制表示
条件判断
- 文件比较运算符
-e filename //如果 filename存在,则为真
-d filename //如果 filename为目录,则为真
-f filename //如果 filename为常规文件,则为真
-L filename //如果 filename为符号链接,则为真
-r filename //如果 filename可读,则为真
-w filename //如果 filename可写,则为真
-x filename //如果 filename可执行,则为真
filename1 -nt filename2 //如果 filename1比 filename2新,则为真
filename1 -ot filename2 //如果 filename1比 filename2旧,则为真
- 字符串比较运算符
-z string //如果 string长度为零,则为真
-n string //如果 string长度非零,则为真
string1 = string2 //如果 string1与 string2相同,则为真
string1 != string2 //如果 string1与 string2不同,则为真
- 算术比较运算符
num1 -eq num2 //等于 [ 3 -eq $mynum ]
num1 -ne num2 //不等于 [ 3 -ne $mynum ]
num1 -lt num2 //小于 [ 3 -lt $mynum ]
num1 -le num2 //小于或等于 [ 3 -le $mynum ]
num1 -gt num2 //大于 [ 3 -gt $mynum ]
num1 -ge num2 //大于或等于 [ 3 -ge $mynum ]
判断表达式是否为真的两种表示方法
- test和[] //返回0成功,返回1失败
方法一:test 表达式
eg:test 1 -eq 0 #表达式为假
方法二:[ 表达式 ]
eg: [ 1 -eq 0 ] #表达式为假
二种分支语句
- if和case
- if/then/else/fi或者if/then/elif/fi
用法:
- if/then/else/fi或者if/then/elif/fi
if [ -d /home/atao/demo1 ]
then
echo true
else
echo false
fi
#如果demo1目录存在就执行then后面的语句,否则执行else后的语句
等同于
1) [ -d /home/atao/demo1 ] && echo true || echo false
2) test -d /home/atao/demo1 && echo true || echo false
- case 字符串 in; 模式1) 语句;;模式2) 语句;;esac
其中:模式可以有多个值,用|分开 如1|2|3|4|5)
用法:
echo -n "please input option:" #提示输入信息
read input_s #从键盘输入
case "$input_s" in #判断入口
1)echo "Linux";;
2)echo "Windows";;
3)echo "Ubuntu";;
*)echo "input_s $input_s choice err" #*)相当于default
exit 1 #错误则返回1
esac
三种循环语句
- for 判断表达式 ;do 语句;done
#!/bin/sh
1)for((x=1; x<5; x++))
do
echo "num $x=$x"
done
2)for x in 123 "abc" "666"
do
echo ${x}
done
- while 判断表达式; do 语句;done
#!/bin/sh
x=1
while((x<=10))
do
echo "Hello x is $x"
let x=x+1 #相当于x++
done
- until 判断表达式;do 语句;done
翻译:until=直到…为止
功能描述:重复循环直到条件为真为止
i=0
until [ $i -ge 20] #当i>=20的时候循环
do
i=$(($i+1))
echo $i
done
- shift命令
功能描述:循环从命令行参数位置变量值取一个值出来,并且把总数减一
• shift后可加整数进行一次多个移位
eg:shift 3
• 用法:
until [ $# -eq 0 ] #从终端获取参数,当参数总数等于0终止循环
do
echo "value=$1 count=$#"
shift 3 #每次向后移动3个位置
done
#注意命令行参数总数,$#每shift一次,值减3
三种跳出机制
- break
break [n]
//中止循环过程的执行,并跳到下一个命令。N表示跳出嵌套的层数 - continue
continue [n]
//停止循环过程的当前一个反复并且跳到循环中的下一个反复过程的开始部分,n表示忽略的层数 - exit
exit [n]
//停止shell程序的执行,并且将返回值设置为n。
shell函数
- 不能单独写在一个脚本里,至少有一个调用语句
- 实例
#!/bin/sh
show()
{
echo "output show $*" #输出参数表
}
echo "Hello kitty"
#调用show()函数,记住在定义函数的脚本里,至少要调用一次
show 123 "abc" "666"
echo "============"
echo $*
echo $1
交互式脚本(输入输出)
- echo 输出语句
- read 变量名
常用参数:read -p “提示信息” //每次输入时read提示
用法 :
#!/bin/sh
read -p "Please input var = " var
echo "var = ${var}"
- 从管道里读取
#!/bin/sh
#read读取一个变量
ls | while read file #默认在本目录循环读取文件
do
ls $file #显示读取到的文件
done
#!/bin/sh
#read可一次性读取多个变量
#默认在本目录中分别读取文件名和文件对应的id号
ls -i | while read file id
do
#file存的是文件名,id存的是文件对应的节点号
echo "File is $file ID is $id"
done
- select 表达式是bash的扩展应用,用户可以从一组不同的值中进行选择
翻译:select 选择
语法结构:
#!/bin/sh
select var in "Linux" "Windows" "Ubuntu"
do
break
done
echo "You have selected $var"
输出:
1) Linux
2) Windows
3) Ubuntu
#? 1
You have selected Linux
脚本调试
//直接在终端下输入命令
- sh -x 命令
•功能描述:执行该脚本并显示所有变量的值。- sh -x name.sh #sh表示运行
- bash -x name.sh #与上述功能一样,表示运行
- sh -n 命令
•功能描述:不执行,只执行语法检查
sh -n name.sh #运行后不报错表示没错误 - trap 命令
• 功能描述:令用于捕获指定的信号并执行预定义的命令。
• 用法
trap ‘command’ signal
//其中signal是要捕获的信号,command是捕获到指定的信号之后,所要执行的命令。可以用kill–l命令看到系统中全部可用的信号名,捕获信号后所执行的命令可以是任何一条或多条合法的shell语句,也可以是一个函数名。
• Shell伪信号
1)EXIT 从一个函数中退出或整个脚本执行完毕
2)ERR 当一条命令返回非零状态时(代表命令执行不成功)
3)DEBUG 脚本中每一条命令执行之前
• (DEBUG)对相关变量的全程跟踪
trap ‘echo “before execute line: L I N E N O , a = LINENO, a= LINENO,a=a,b= b , c = b,c= b,c=c”’ DEBUG
• (EXIT)判断脚本的执行状态以及出错原因
trap ‘command’ EXIT 或 trap ‘command’ 0
• (ERR)追踪执行不成功的命令或函数,并输出相关的调试信息
trap ‘ERRTRAP $LINENO’ ERR
系统的几个脚本
- init脚本的存储目录
• /etc/rc ,/etc/rc.d/init.d 或者 /etc/init.d 目录下
2./sbin/service 用于控制各种服务的启动和停止
用法:
• /sbin/service smb restart #重启smb服务器
七、gcc相关编译工具
//gcc一般安装在/usr/bin
- 编译一个程序的完整
1)编写源文件 .cpp/.c
2)预编译->将头文件进行预处理 *.i
3)编译->将源代码编译生成汇编代码 *.s
4)汇编->汇编代码生成目标代码 *.o
5)链接->对所有文件进行链接生成可执行文件 *.out/*.o - gcc支持的文件格式
1)*.c c语言源程序
2)*.c/.cc/.cxx/.cpp C++源程序
3)*.m Objective-C源程序
4)*.i 预处理后的C文件
5)*.ii 预处理后的C++文件
6)*.s/.S 汇编语言源程序
7)*.h 预处理器文件
• 其它格式:
*.o 目标文件(Object file)
*.a 归档库文件(Archive file) - gcc进行的操作
1)gcc 调用cpp进行预处理
2)gcc 调用cc1进行编译,会生成汇编代码
3)gcc 调用as 对汇编代码,生成扩展名为.o的目标文件
4)gcc 调用ld 来完成对所有目标文件的链接 - 编译实例
格式:gcc 源代码.c -o 自定义输出名.out
//若不指定输出名,默认输出a.out - 用gcc编译单个文件
1)进行预编译
gcc -E main.c -o main.i
2)将c代码编译成汇编代码
gcc -S main.i -o main.s
3)将汇编代码生成目标代码
gcc -c main.s -o main.o
4)将生成的目标文件链接生成可执行文件
gcc main.o -o main.out
• 其它参数
-v 显示执行编译阶段的命令.同时显示编译器驱动程序,预处理器,编译器的版本号.
6. 用gcc编译一个工程文件,即多个文件
• 格式:gcc -I头文件目录 源目录文件 -o 输出文件
gcc -I./atao/HeaderFiles/ ./atao/SoucreFiles/.c -o main.out
#当有多个头文件时要多次使用[-I目录] - file文件分析命令
用法:file 文件
• 结果分析中英文解析
1)not stripped //包含调试信息
2)relocatable //目标文件格式
3)executable //表示是可执行文件
4)Inter 80386 //CPU
5)dynamically linked //动态链接版本
• 其中
#:strip 可执行文件 //可清除gcc -g 源代码.c的调试信息 - 警告提示功能(直接在终端下执行)
1)-Wall //打开所有有用的编译警告
2)-Werror //视警告为错误,出现任何警告即放弃编译
3)-w //禁止输出警告信息
• 常用组合
#:gcc -Wall -Werror 源文件.c -o 输出文件.out - 宏选项(直接在终端下执行)
• 语法结构
1)定义宏的内容为等号后面的字符串 //相当于在代码里的#define
#:gcc 源文件.c -D__宏名=字符串 -o 输出文件.out(执行文件)
//注意-D后面没空格时要加两个下划线
或者
#:gcc 源文件.c -D 宏名=字符串 -o 输出文件.out(执行文件)
//注意:-D后面有空格时直接加宏名
2)取消宏的定义,-U选项在所有的-D选项之后
#:gcc 源文件.c -U 宏名 -o 输出文件.out(执行文件)
• 注意
//在一个gcc语句中,-D只能定义一个宏,多个宏需要多个-D来定义. - 库的链接
//#:set 回车 //查看系统已定义了的环境变量
1)两种函数库
• 静态库 *.a
特点:生成的文件较大,但运行时就不用再需要库文件了.
• 动态库 *.so
特点:编译并没有链接库,而是程序执行运行时时链接文件加载库
注意:
Linux下的库文件命名时有一个规定:必须以“lib”开头.因此-l选项指定
链接库文件时可以省去"lib"这个库文件名头.
- 静态库的创建:(可以不用把主函数生成目标文件)
#:gcc -I./HeaderFiles -c ./SoucreFiles/main.c -o ./Debug/main.o
#:gcc -I./HeaderFiles -c ./SoucreFiles/fun.c -o ./Debug/fun.o
//生成目标代码
#:ar -crsv libmydll.a ./Debug/*.o
//创建静态库文件,叫:mydll
#:gcc -I./HeaderFiles ./SoucreFiles/main.c -L./ -lmydll -o run.out
//链接动态库,并生成可执行文件
//其中,-L创建的库所在的目录
-l自定义的库名,不用加后缀==lib自定义的库名.a
【参数】
- r //将目标代码插入到档案文件中(下面有介绍).
- v //显示ar操作的附加信息.
- c //创建库,增加索引信息.
- s //表示创建的是静态库
- 动态库的创建
• 隐式调用
#:gcc -fpic -I./HeaderFiles -c ./SoucreFiles/fun.c -o ./Debug/fun.o
//将自定义函数编译成目标文件
#:gcc -shared ./Debug/fun.o -o ./librundll.so
//将自定义函数的目标文件加入到自定义的动态库文件中
#:gcc -I./HeaderFiles ./SoucreFiles/main.c -L./ -lrundll -Wl,-rpath,$(pwd) -o ./Debug/main.out
//调用动态库文件并生成可执行文件
【参数】
-fpic //编译目标文件时,带上-fpic标志,使输出的对象块是按照可重定位地址方式生成的
-shared //必须带上-shared,明确表示是动态链接库
-Wl,-rpath机制就是将随后的路径写入程序。优点就是执行简单,缺点就是编译环境和运行环境的库路径要完全一样,不能修改。
• 显式调用
#include <dlfcn.h> //1.导入头文件
int main(void)
{
void *phandle = NULL; //2.定义动态库操作句柄
void *pshow = NULL;
phandle = dlopen("./libmydll.so", RTLD_LAZY);//3.打开动态库
/*
参数一是自定义的动态库名,参数二是指定如何打开共享库文件
其中:
RTLD_NOW:将共享库中的所有函数加载到内存
RTLD_LAZY:延迟加载库操作,直到调用dlsym()时方加载某函数
*/
pshow = dlsym(void *handle, char *symbol);
//4.用dlsym取得对应库函数的函数指针,相当于使用库函数
dlclose(phandle);//5.关闭句柄,释放共享库
return 0;
}
- 优化选项参数 -O数字(是大写O)
1)用法:
#:gcc -O2 源文件.c //将源文件.c的代码优化,级别为2
//优化级别的数字为:0~3
注意:
• 优化等级一般-O1就可以了
• 只有最终发行时才考虑优化,中途优化时代码可能被调整
2)time命令测试程序运行的时间
• 用法:time 程序名
#:time main.out
//运行后包含的信息 :
real 0m0.004s //程序本身运行所需时间
user 0m0.000s
sys 0m0.000s
12. GNU工具集GNU binutils
//是一套用来构造和使用二进制所需的工具集.
1)辅助工具
addr2line //将地址转换成文件名或行号对,以便调试
eg#:addr2line 内存地址 -e 目标程序
//将一个进程内地址转换源码文件里某一行,这样方便调试
ar //用于建立、修改、提取档案文件,用于建静态库
file //file命令用来判别文件类型
nm //列出目标文件中的符号
eg#:nm 可执行文件.out
objcopy //可将一种格式的目标文件转为另一种格式的目标文件
eg#:objcopy -O 指定输出文件类型 源文件 输出文件
objdump //将c程序反汇编,用来显示目标文件信息,可通过选项控制显示那些特定信息
eg1#:objdump -f 可执行文件.o //显示目标文件的头部概要信息
eg2#:objdump -d 可执行文件.o //显示目标文件中机器指令使用的汇编语言.只反汇编那些应该含有指令机器码的节(显示.text段)
eg3#:objdump -D 可执行文件.o //反汇编所有节的内容
eg4#:objdump -x 目标文件 | grep NEEDED
eg5#:objdump -x 目标文件 | grep NEED
//不需运行起程序;可以查看动态库和目标文件依赖。
ranlib //生成索引以加快对归档文件的访问,并将结果保存到这个归档文件中
readelf //用来显示ELF格式目标文件的信息
eg1#:readelf -h 可执行文件 //读取ELF头信息
eg2#:readelf -a 可执行文件 //读取所有的ELF信息
eg3#:readelf -a 可执行文件 | grep NEEDED
//与objdump一样,也可查看目标文件的依赖
size //显示归档文件和目标文件的各段尺寸
eg#:size 可执行文件 //查看该文件各段的尺寸大小
//执行命令后结果中:- Dec表示10进制的各段的尺寸之和
strings //显示文件中可打印文本信息
strip //清除可执行文件的符号和调试信息
windres //windows资源编译器
gprof //用来测量程序的性能,能记录每个函数被调用的次数以及相应的执行时间。有助于针对性的优化程序
2)nm运行后显示结果的参数解析
A//符号的值是绝对值,并且不会被将来的链接改变
B//全局变量,符号位于未初始化数据部分(BSS段)
b//静态变量
C//公共的,若其它地方被定义,则会当成引用处理
D//全局变量,符号位于已初始化数据部分
d//静态变量
T//符号位于代码部分
U//符号未被定义,通常是外部库函数
://符号类型未知,或者目标文件格式特殊
八、网络命令
- [任意在线用户]
功能描述:给指定的在线用户发送消息
eg#:write atao
//命令执行后就可以输入消息内容了,然后按Ctrl+D保存发送并退出 - wall [消息内容]
功能描述:给所有在线用户发送广播消息
eg#:wall 你好,世界 - mail [收信用户]
• 功能描述:给指定用户发送邮件
eg#:操作步骤如下
1)mail atao 回车
2)Subject:邮件标题 回车
3)输入邮件内容
4)按Ctrl+D 发送并退出
• 查看邮件
在终端下执行命令#:mail 回车
其中:
1 //按1,即邮件序号可以查看邮件内容
h //按h, 查看邮件列表,即有哪些邮件
d 1 //按d + 序号,表示删除序号为几的邮件
q //按q 退出邮件 - last命令
功能描述:查看目前及过去登入系统的用户信息
eg#:last 回车 - lastlog命令
功能描述:查看最后登入系统的用户信息
eg#:lastlog 回车
其中:只查看某一用户登入系统的信息
命令:lastlog -u 用户的ID号
eg#:lastlog -u 502 //表示只查看ID号为502的用户登入信息 - traceroute [网址]
功能描述:跟踪路由。查看本机到达某一指定网站所经过的路径
eg#:traceroute www.baidu.com //查看本机到达百度所经过的路径 - netstat [参数]
功能描述:查看网络相关信息
参数:
-t //TCP协议
-u //UTP协议
-l //监听
-r //路由
-n //显示IP地址和端口号
常用组合:
eg1#:netstat -tlun //查看本机监听的端口
eg2#:netstat -an //查看本机所有的网络连接
eg3#:netstat -rm //查看本机路由表
- mount挂载命令
功能描述:手动连接外接设置,如光驱,U盘等
语法结构:mount [-t 文件系统] 设置文件名 挂载点
或者:mount 设置名称 挂载点 //因为文件系统一般是已经默认的
卸除挂载点:umount 设置文件/挂载点
操作步骤:
1)#:mkdir /mnt/cdrom //创建一个目录用来挂载
2)#:mount -t iso9660 /dev/sro /mnt/cdrom
//将设备文件中的光驱设备目录文件/dev/sro挂载到建立的挂载目录
或者:mount /dev/sro /mnt/cdrom
3)cd /mnt/cdrom/ //然后就可以访问这个光盘里的文件了
4)umount /dev/sro //用完之后要记得弹出光驱,即卸除挂载点
- setup命令(永久更改IP地址)
功能描述:配置网络
eg#:setup 回车 //进入网络配置界面
====最后记得重启服务
#:service network restart //重新启动网卡
10.netconfig命令
功能描述:在图形界面中永久更改ip地址信息
语法结构:netconfig 回车
====最后记得重启服务
#:service network restart //重新启动网卡
11.修改网卡的配置文件(永久更改ip地址信息)
vim /etc/sysconfig/network-scripts/ifcfg-网卡0
====最后记得重启服务
#:service network restart //重新启动网卡
九、 启动配置文件
- 两种修改方式
- #:vim /etc/inittab
//可以修改启动模式,如3 命令行模式 5 图形界面模式
2)#init 数字
- #:vim /etc/inittab
0 //关机
1 //单用户
2 //不完全多用户,不含NFS服务,即不包含网络服务的命令行模式
3 //完全多用户,即纯命令行模式
4 //未分配
5 //图形化界面模式
6 //重启
- runlevel查询系统运行级别(模式)
eg#:runlevel 回车 - logout退出登录命令
功能描述:相当于锁屏功能
eg#:logout 回车
十、 vim编辑器
- 常用命令
:set nu //设置行号
:set nonu //取消行号
:数字 //定位到第几行
gg //跳到第一行
G //跳到最后一行
dd //删除光标所在的行,ndd 表示删除光标以下的n行
D //删除光标所在处到行尾的内容
yy //复制光标所在行
nyy //复制当前行以下的n行
dd //剪切当前行
ndd //剪切当前行以下的n行
p //粘贴
u //撤消
/搜索词 //搜索指定的搜索词
:w 另存为文件名 //另存为指定的文件
- 小技巧命令
1):r 文件名 //在当前文件的光标处导入指定的文件中的内容 如:r ./text
2):!which 命令 //可以在当前文本内使用查询命令 如:!which ls
3):r !命令 //将命令结果插入到当前文本的光标所在处 如:r !who
4):map Ctrl+v+自定义的快捷键字母 要完成的功能 //自定义快捷键
//如:map Ctrl+v+h iHello,world<ESC>
//表示当按下Ctrl+h键的时候在光标处插入了Hello,world字符,并即出编辑
5):1,4s/^/#/g //表示在1-4行的行首插入一个注释字符#
//格式:数字,数字s/^/要插入的字符/g
//其中^表示行首 g表示不用确认
6):1,4s/^#//g //表示将行首的#号去掉
7):ab 字符1 字符2 //替换命令
//表示在编辑模式中当输入字符1的时候自动替换成字符2
- 修改编辑模式中的配置文件(.vimrc)
方法:vim /home/username/.vimrc
//配置文件一般存放在用户的.vimrc文件中
十一、makefile自动编译管理器
//它能够根据文件时间戳自动发现更新过的文件而减少编译工作量
- 更新文件修改时间的方法
命令:#:touch * //将所有文件时间调为当前时间 - 语法格式
• 注意
1)每一行命令行的行首必须是一个跳格字符(即tab)
2)如果命令行过长,可用\分行,分行后的新行,无需使用tab打头
• 格式为:(首先要创建makefile文件)
all : 可执行文件.out
目标名称 : [依赖文件*.c/*.h/*.o]
<Tab>命令语句1
<Tab>命令语句2
...
clean :
<Tab>-rm -fr 需删除的文件
all : main.out
fun.o : header.h fun.c
gcc -I./ -c ./fun.c -o ./fun.o
main.out : header.h fun.o main.c
gcc -I./ ./main.c ./fun.o -o ./main.out
clean :
-rm -fr ./*.o
• 其它注意的格式(在make脚本文件中)
1)"@"的使用
含义:在语句开头表示在编译时不显示执行过程,只显示输出结果
如: @gcc .I./HeaderFiles ./SoucreFiles/main.c -o ./main.out
2)"-"的使用
含义:在语句开头表示在编译时忽略错误继续往下执行,否则终止
如:-gcc .I./HeaderFiles ./SoucreFiles/main.c -o ./main.out
echo "Hello, world!"
- .PHONY关键字来声明伪目标
eg:.PHONY clean,install,all #表示三个都是伪目标
1)make 内置的一些常用的伪目标.
clean 清除项目生成的中间文件和最终成文件
install 项目如何安装
.uninstall 项目如何卸载
- make的调用
1)#:make 回车
//这是默认的调用方式,make编译器会在当前目录自动寻找
2)#:make -f mymakefile
//这是指定了文件名,make编译器寻找指定的make文件名
3)#:make -C /home/atao/makefiles/
//这是指定了make文件所在的目录 - 只编译特定部分
1)当一个项目有多个版本或不同的部分,在makeflie里用target(目标)表示.即:在makefile里写在(冒号)前面的文件
2)可以在终端命令里用make命令后面加目标,对多个目标进行编译.
eg1#:make all
eg2#:make clean
eg3#:make install
eg4#:make uninstall
eg5#:make 目标1 目标2 目标3 ...
- makefile变量
1)功能描述:当要以相同的编译选项同时编译多个源文件时,可以定义makefile变量代替重复出现的编译或命令。(即替换的a)
2)实例代码如下
CCG = gcc
HEAD = -I./
all : main.out
main.out : header.h main.c
$(CCG) $(HEAD) ./main.c -o main.out
3)格式注意与shell变量定义相反
• make定义变量时=(等号)两边要加空格,而shell不需要.
• make用$(变量)来保护变量,而shell用${变量}保护变量.
• make变量的定义一般放在最前面,即规则之前.
• Makefile中,可以用export 把自己的变量变成环境变量.
• Makefile变量分为自定义变量、预定义变量和自动变量.
注意:
一般在makefile中定义时采用:
VAR := value
//(:=)的方式,只会展开一次,消除了无穷递归展开的方式.
4)预定义变量(可以直接在makefile里使用,也可覆盖)
– AR 归档维护程序的名称,默认值为 ar。
– ARFLAGS 归档维护程序的选项,无默认值。
– CC C 编译器的名称,默认值为 cc。
– CFLAGS C 编译器的选项,无默认值。
– LDFLAGS C 链接器的选项,无默认值。
– RM 文件删除程序名称,默认值为rm –f。
– CXX C++ 编译器的名称,默认值为 g++。
– CXXFLAGS C++ 编译器的选项。
5)自动变量
– $< 第一个依赖文件的名称。
– $@ 目标的完整名称。
– $^ 所有的依赖文件,以空格分开,不包含重复的依赖文件。
– $* 不包含扩展名的目标文件名称。
– $+ 所有的依赖文件,以空格分开,并以出现的先后为序,可能包含重复的依赖文件。
– $? 所有的依赖文件,以空格分开,这些依赖文件的修改日期比目标的创建日期晚。
– $% 如果目标是归档成员,则该变量表示目标的归档成员名称。例如,如果目标名称为 mytarget.so(image.o),则$@为mytarget.so,而$%为image.o。
6)变量替换
//替换引用是用指定的变量替换一个变量的值.(一般替换结尾的部分)
如:将后缀.c的文件替换为后缀为.o的文件
fun := a.c b.c
bar := $(fun : .c = .o)
7)引用其它的makefile
语法结构 :include makefile1 makefile2 makefile3
//多个文件用空格分隔,可以包含路径或通配符
7. makefile里的条件控制
1)注意
• make的条件控制实际只能控制makefile里的命令执行部分,不能控制规则的shell命令执行过程
• 条件语句可以是两个不同变量、或者变量和常量值的比较
2)语法
#方法一:
ifeq (变量1, 变量2)
语句1
else
语句2
endif
#方法二:
ifdef 值
语句
endif
#实例
ifdef 1
ifeq (4, 5)
echo "4 等于 5"
else
echo "不相等"
endif
endif
- makefile中的函数
1)常用的一个函数origin函数
• 语法结构:echo $(origin 变量)
• origin函数的返回值:
undefined //表示该变量从未定义过
default //表示该变量是默认的定义
environment //是环境变量,并且当Makefile被执行时,"-e"参数未打开。
file //说明定义在当前makefile中
command line //这个变量是被命令行定义的
override //说明该变量是被override指示符重新定义的
automatic //是一个命令运行中的自动化变量
- 基于Makefile的开源项目
• 典型例子
1)tree,分颜色显示目录树的命令行工具.
2)rzsz ,利用串口传输文件的工具.可移植到ARM开发板
3)tftp-hpa ,TFTP客户端,可以移植到ARM开发板
十二、autotools自动生成makefile文件
- 生成流程
1)运行autoscan命令
2)将conigure.scan文件重命名为configure.in,并修改该文件
3)在project目录下新建makefile.am文件,并在core和shell目录下也新建makefile.am文件
4)运行aclocal命令,生成m4宏文件
5)运行autoconf命令,生成configure文件
6)运行automake -a命令,生成makefile.in
7)运行./configure脚本,读入makefile.in生成makefile - 实例操作步骤(静态库的应用)
前提:已经写好了源程序
1)在终端下运行#:autoscan命令
2)执行改名命令#:mv conigure.scan conigure.in
3)新建三个makefile.am文件。分别是顶层目录,源目录,头文件目录
4)配置顶层目录里的makefile.am文件。如下
• AUTOMAKE_OPTIONS=foreign
#指定automake代码级别,这里的级别为foreign
• SUBDIRS=SourceFiles HeaderFiles
#指定需要的子目录,只需写目录名即可,多个用空格分隔
• ROOT_DIR=$(shell /bin/pwd)
#定义变量用于获取顶层路径
• INCLUDES=-I$(ROOT_DIR)/HeaderFiles
• export INCLUDES
#指定头文件所在的路径,并导出供子目录makefile.am使用
• bin_PROGRAMS=target
#指定要产生的执行文件名
• target_SOURCES=$(ROOT_DIR)/SourceFiles/main.c
#指定产生执行文件需要的源文件,即主函数main.c
• target_LDADD=$(ROOT_DIR)/SourceFiles/libname.a
#表示增加链接库
5)配置SoucreFiles目录里的makefile.am
• noinst_LIBRARIES=libname.a
#在SourceFiles目录里生成静态库,以便顶层目录文件链接使用
• libname_a_SOURCES=fun1.c fun2.c fun3.c ...
#将函数文件导入到静态库libname.a里,以空格隔开
6)配置HeaderFiles目录里的makefile.am
• EXTRA_DIST=header.h
#EXTRA_DIST表示用来定义要额外打包的文件名称
7)配置顶层目录下的configure.in文件
• #:vim configure.in
• 修改AC_INIT宏,指定软件包名称/版本/bug报告路径
AC_INIT(myautomake, 1.1.2, /home/atao/err/)
• 屏蔽AC_CONFIG_HEADER宏
#AC_CONFIG_HEADER
• 由于我们将要把SourceFiles目录内的源文件编译成静态库,所以需要加入一个宏
AC_PROG_RANLIB
• 加入automake必需的宏
AM_INIT_AUTOMAKE
8)开始使用autotools,使生成makefile
#生成configure文件
• #:aclocal
#为autoconf产生处理本地宏的aclocal.m4文件
• #:autoconf
#生成makefile.in文件,其中--add-missing会自动添加重要脚本
• automake --add-missing
#产生makefile文件,读入makefile.in文件生成makefile
• #:./configure
#使用makefile,执行编译,并自动生成可执行文件
• #:make
#运行可执行文件
• #:target
9)大功告成
- 关于makefile的使用
#:make
/*
当执行编译,产后可执行文件target
其中,automake默认的是:gcc -Wall O2 -g,
怎么改为我们实际需要的编译选项?需使用如下命令:
方法一:configure:CFLAGS="-Wall -g" ./configure
方法二:当然也可以直接顶层Makefile.am中添加CFLAGS="-Wall -g"
*/
#:make install
//将可执行文件target安装到系统目录
#:make clean
//清除前一次编译的目标文件(.o), 库文件(.a),可执行文件
#:make distclean
//除了执行make clean的工作外,还会清除./x过程生成的文件
#:make dist
//将源程序和相关文档打包成一个压缩文档以供发布
- configure脚本选项
• configure 有大量选项可供不同需求要求
– --help 查看所有选项
– --prefix=PEWFIX 输入安装目录前缀.
#: ./configure --prefix=/opt/gnu
– CFLAGS=“-Wall -g” ./configue
– LDFLAGS=“-L –l -static” ./configue
– CC=“arm-linux-gcc” ./configue
– --host
• 指定软件运行的系统平台.如果没有指定,将会运行`config.guess‘来检测.
如:arm通常用 –host=arm-linux
./configue --host=arm-linux --build=i386-linux
– '--target=GARGET' – 指定软件面向(targetto)的系统平台.这主要在程序语言工具如编译器和汇编器上下文中起作用.如果没有指定,默认将使用'--host'选项的值
- autotools制作动态库的过程
•操作步骤与制作静态库大体相似,但需要修改部分配置
1)在顶层目录的configure.in文件里的修改
用AC_PROG_LIBTOOL替换AC_PROG_RANLIB
//表示利用libtool来自动生成动态库
2)修改顶层目录和SourceFiles目录里的makefile.am文件
a)在顶层目录里将libname.a修改为libname.la
b)在SourceFiles里修改库名为lib_LTLIBRARIES=libname.la
c)在SourceFiles里libname_la_SOURCES=fun1.c fun2.c fun3.c
3)在终端执行autoconf之前,首先执行libtoolize -f –c
//生成制作动态库必要的文件
十三、安装rpm二进制安装包
- RPM包管理-rpm命令管理
安装语法结构:rpm -ivh 包全名
升级语法结构:rpm -Uvh 包全名
卸载语法结构:rpm -evh 包全名
查询是否安装:rpm -qa 包名
【参数】
-r //安装
-v //显示详细信息
-h //显示进度
-e //卸载
-U //升级
-q //查询
-a //所有 - RPM包管理-yum命令管理
- yum的命令:
yum list //查询所有可用软件包列表
yum search 关键字 //搜索服务器上所有和关键字相关的包
yum -y install 包名 //安装软件包,并自动回答:是
yum -y update 包名 //升级软件包
yum -y remove 包名 //卸载软件包 - yum软件组管理命令
yum grouplist //列出所有可用的软件组列表
yum groupinstall 软件组名 //安装指定软件组
yum groupremove 软件组名 //制裁指定软件组
- yum的命令:
十四、 Linux 里的默认路径
/etc/ 配置文件安装目录
/usr/bin/ 可执行的命令安装目录
/usr/lib/ 程序所使用的函数库保存位置
/usr/share/doc/ 基本的软件使用手册保存位置
/usr/share/man/ 帮助文件保存位置
/usr/local/软件名/ 源码包安装位置(自己安装的软件)
/bin/ 存一般用户使用的可执行程序
/sbin/ 存管理员使用的可执行程序
/boot/ 启动需要的文件
/home/ 各用户的家目录
/var/log/ 存放日志等信息
/usr/ 用户自行安装的软件存放在此