文章目录
- Linux驱动开发快速复习
- Linux操作系统基础
- shell命令操练 :16~26
- 16:各个tty界面的切换(20.04及以后的版本中需要先关闭图形模式,然后才能进入到tty模式中)
- 17:history、alias、pwd
- 18:mkdir、rmdir、touch、c、mv、rm、chown、chgrp、chmod
- 19:grep、find、locate、ln、tar、gzip
- 20:diff、patch
- 22:fdisk分区、mkfs(对u盘进行分区创建文件系统)、umount
- 23:passwd修改密码
- 24:useradd的使用操作、adduser(会自动建立用户目录文件)、usermod使用操作、userdel/deluser、groupadd、groupdel与groupmod与user操作差不多可以参考、id 、who、whoami
- 25:su、sudo
- Linux应用程序安装与卸载 :27~31
- Linux服务程序安装与卸载 32~35
- 34:chkconfig工具、关闭重启服务的方法、服务器程序的安装思路
- 35:Linux服务程序的安装演示
- Vi/Vim的设计思想及使用:36~38
- Linux应用系统开发
- GNU开发环境基础:1~15
- GNU开发环境基础:IO操作
Linux驱动开发快速复习
Linux操作系统基础
12:cat、ls、whereis用法
-
ls -a 显示所有文件及目录 (. 开头的隐藏文件也会列出)
ls -l 除文件名称外,亦将文件型态、权限、拥有者、文件大小等资讯详细列出例如:
dr-xr-x—. 2 root root 135 Dec 16 02:34 .
第一列共10位,第1位表示文档类型,d表示目录,-表示文件,l表示链接文件,d表示可随机存取的设备,如U盘等,c表示一次性读取设备,如鼠标、键盘等。后9位,依次对应三种身份所拥有的权限,身份顺序为:owner、group、others,权限顺序为:readable、writable、excutable。如:-r-xr-x—的含义为当前文档是一个文件,拥有者可读、可执行,同一个群组下的用户,可读、可执行,其他人没有任何权限。
第二列表示链接数,表示有多少个文件链接到inode号码。
第三列表示拥有者
第四列表示所属群组
第五列表示文档容量大小,单位字节
第六列表示文档最后修改时间,注意不是文档的创建时间哦
第七列表示文档名称。以点(.)开头的是隐藏文档 -
另外 ll 是ls -l 的一个别名
cd命令用于进入不同目录,下面以在/home/jack/a/b/c/c/d文件夹下采用不同方法进入到/home/jack/a文件夹下为例,介绍使用cd命令的不同切入方法。
第一种方法:
采用cd …的方式一点点返回到a文件夹下,参考如下图片。
第二种方法:
采用cd …/…/…/…的方式返回到a文件夹下。
第三种方法:
采用cd ~/a的方法进入到a文件夹下。
第四种方法:
采用绝对路径cd /home/jack/a的方法进入到a文件夹下。
whereis 例如whereis ls 当前可执行文件的路径在哪儿
13:GNU的来历
GNU是“GNU’s Not Unix”的递归缩写
GNU计划,又称革奴计划,是由Richard Stallman在1983年9月27日公开发起的。它的目标是创建一套完全自由的操作系统。
【历史】
1985年Richard Stallman又创立了自由软件基金会(Free Software Foundation)来为GNU计划提供技术、法律以及财政支持。
到了1990年,GNU计划已经开发出的软件包括了一个功能强大的文字编辑器Emacs。GCC(GNU Compiler Collection,GNU编译器集合),是一套由 GNU 开发的编程语言编译器。以及大部分UNIX系统 GNU操作系统的内核Linux的程序库和工具。唯一依然没有完成的重要组件就是操作系统的内核(称为HURD)。
1991年Linus Torvalds编写出了与UNIX兼容的Linux操作系统内核并在GPL条款下发布。Linux之后在网上广泛流传,许多程序员参与了开发与修改。1992年Linux与其他GNU软件结合,完全自由的操作系统正式诞生。该操作系统往往被称为“GNU/Linux”或简称Linux。(尽管如此GNU计划自己的内核Hurd依然在开发中,目前已经发布Beta版本。)
许多UNIX系统上也安装了GNU软件,因为GNU软件的质量比之前UNIX的软件还要好。GNU工具还被广泛地移植到Windows和Mac OS上。
GNU 包含3个协议条款,
GPL3:GNU通用公共许可证(GNU General Public License)
LGPL:GNU较宽松公共许可证 (GNU Lesser General Public License), ) ,现在的apache license 也是基于它发展而来的 。
GFDL : GNU自由文档许可证(GNU Free Documentation License )的缩写形式。
14:bash的安装
bash与coreutils的下载与安装(该处内容不重要)
15:Linux与bash命令的实现原理
在终端输入命令后会去环境变量中寻找执行路径,然后去内核中调用相关的api(该处不重要,可作为参考了解)
shell命令操练 :16~26
16:各个tty界面的切换(20.04及以后的版本中需要先关闭图形模式,然后才能进入到tty模式中)
关闭用户图形界面,使用tty登录。
sudo systemctl set-default multi-user.target
sudo reboot
注意:
关闭图形界面重启后, 需要 Ctrl+Alt+F1 切换到命令行模式,否则重启之 后会停在黑屏状态,实际上系统是已经启动完成的,通过ssh也能连接上
开启用户图形界面。
sudo systemctl set-default graphical.target
sudo reboot
进入到tty终端模式:ctrl+alt+f2
返回到图形桌面:ctrl+alt+f1 然后在可视化界面的时候可以 ctrl+alt+t 快捷打开可视化的terminal
简单的搜索terminal终端,一般常用CTRL+ALT+T打开终端,使用ALT+F1~F6功能键打开tty控制台
tty
tty 为Ubuntu的纯文本串行终端,通常用作访问计算机以修复内容的方式登录,没有实际登录到可能的图像界面.tty一般为tty3-tty6 可以通过 按ctrl +alt + F1- F6 实现,通过tty可以控制程序,杀死进程,完成在terminal上完成的大部分命令.
shell命令格式:
注意大小写识别
通配符 例如:ls .txt ?.txt(一个问号代表一个位置符) [a-z].txt(字符取值范围)[.]*
管道 Pipe : 吧前面进程的输出作为后面进程的输入 , 把前面文件的输出做为后面进程的输入
例如:ps -aux | grep *.txt
输入/输出重定向,注意:>后跟完整路径表示如果不存在将建立,并且以覆盖的方式添加上去,>>则表示以追加的方式添加在文末
例如:ls > show.txt 、ls >> show.txt 、cat <show.txt、cat <<show.txt
Man工具就是系统帮助手册
查看官方的命令帮助手册:man +命令如 man ls
Info工具是一个基于菜单的超文本系统,由GNU项目开发并由Linux发布。info工具包括一些关于Linux shell、工具、GNU项目开发程序的说明文档。
17:history、alias、pwd
- cd 切换目录
例如:cd …返回上级目录
进入到当前目录 cd ~/ 、cd /、pwd
history n 显示n条历史命令
-
alias 给命令或者字符取个别名alias name=“command”
例如 alias hejinqiu=“ls -l” -
pwd 查找当前的路径
-
Linux file命令用于辨识文件类型
file [-bcLvz][-f <名称文件>][-m <魔法数字文件>…][文件或目录…] -
echo 结果显示在屏幕上
18:mkdir、rmdir、touch、c、mv、rm、chown、chgrp、chmod
-
mkdir(英文全拼:make directory)命令用于创建目录。
-p 确保目录名称存在,不存在的就建一个。 -
rmdir(英文全拼:remove directory)命令删除空的目录
-p 是当子目录被删除后使它也成为空目录的话,则顺便一并删除。 -
touch 命令用于修改文件或者目录的时间属性,包括存取时间和更改时间。若文件不存在,系统会建立一个新的文件
-n 或 --number:由 1 开始对所有输出的行数编号。
-b 或 --number-nonblank:和 -n 相似,只不过对于空白行不编号。 -
mv(英文全拼:move file)命令用来为文件或目录改名、或将文件或目录移入其它位置。
命令格式 | 运行结果 |
---|---|
mv source_file(文件) dest_file(文件) | 将源文件名 source_file 改为目标文件名 dest_file |
mv source_file(文件) dest_directory(目录) | 将文件 source_file 移动到目标目录 dest_directory 中 |
mv source_directory(目录) dest_directory(目录) | 录名 dest_directory 已存在,将 source_directory 移动到目录名 dest_directory 中;目录名 dest_directory 不存在则 source_directory 改名为目录名 dest_directory mv source_directory(目录) dest_file(文件) 出错 |
-
cp(英文全拼:copy file)命令主要用于复制文件或目录。
cp 将当前目录 test/ 下的所有文件复制到新目录 newtest 下
$ cp –r test/ newtest -
rm(英文全拼:remove)命令用于删除一个文件或者目录。
删除文件可以直接使用rm命令,若删除目录则必须配合选项"-r",例如:
rm -r homework
rm test.txt
常用 rm -r \ rm -f或者rm -rf表示强制删除 -
chown(英文全拼:change owner)命令用于设置文件所有者和文件关联组的命令。注意:chown 需要超级用户 root 的权限才能执行此命令
使用方法:chown [-cfhvR] [–help] [–version] user[:group] file…
把 /var/run/httpd.pid 的所有者设置 root:
chown root /var/run/httpd.pid
将文件 file1.txt 的拥有者设为 runoob,群体的使用者 runoobgroup :
chown runoob:runoobgroup file1.txt
将当前前目录下的所有文件与子目录的拥有者皆设为 runoob,群体的使用者 runoobgroup:
chown -R runoob:runoobgroup *
把 /home/runoob 的关联组设置为 512 (关联组ID),不改变所有者:
chown :512 /home/runoob -
chgrp(英文全拼:change group)命令用于变更文件或目录的所属群组。注意:与 chown 命令不同,chgrp 允许普通用户改变文件所属的组,只要该用户是该组的一员。
使用方法:chgrp [-cfhRv][–help][–version][所属群组][文件或目录…] 或 chgrp [-cfhRv][–help][–reference=<参考文件或目录>][–version][文件或目录…]
例如:改变文件的群组属性:
chgrp -v bin log2012.log -
chmod(英文全拼:change mode)命令是控制用户对文件的权限的命令
只有文件所有者和超级用户可以修改文件或目录的权限。可以使用绝对模式(八进制数字模式),符号模式指定文件的权限。
语法:chmod [-cfvR] [–help] [–version] mode file…
[ugoa…][[±=][rwxX]…][,…]
- u表示该文件的拥有者,g 表示与该文件的拥有者属于同一个群体(group)者,o 表示其他以外的人,a 表示这三者皆是。
-
- 表示增加权限、- 表示取消权限、= 表示唯一设定权限。
- r 表示可读取,w 表示可写入,x 表示可执行,X 表示只有当该文件是个子目录或者该文件已经被设定过为可执行。
- 其他参数说明:
-c : 若该文件权限确实已经更改,才显示其更改动作
-f : 若该文件权限无法被更改也不要显示错误讯息
-v : 显示权限变更的详细资料
-R : 对目前目录下的所有文件与子目录进行相同的权限变更(即以递归的方式逐个变更)
给不同用户或者用户组加权限
符号模式:
使用符号模式可以设置多个项目:who(用户类型),operator(操作符)和 permission(权限),每个项目的设置可以用逗号隔开。 命令 chmod 将修改 who 指定的用户类型对文件的访问权限,用户类型由一个或者多个字母在 who 的位置来说明,如 who 的符号模式表所示:
who | 用户类型 | 说明 |
---|---|---|
u | user | 文件所有者 |
g | group | 文件所有者所在组 |
o | others | 所有其他用户 |
a | all | 所用用户, 相当于 ugo |
operator 的符号模式表: | ||
Operator | 说明 | |
:----: | :----: | |
+ | 为指定的用户类型增加权限 | |
- | 去除指定用户类型的权限 | |
= | 设置指定用户权限的设置,即将用户类型的所有权限重新设置 | |
permission 的符号模式表: |
模式 | 名字 | 说明 |
---|---|---|
r | 读 | 设置为可读权限 |
w | 写 | 设置为可写权限 |
x | 执行权限 | 设置为可执行权限 |
X | 特殊执行权限 | 只有当文件为目录文件,或者其他类型的用户有可执行权限时,才将文件权限设置可执行 |
s | setuid/gid | 当文件被执行时,根据who参数指定的用户类型设置文件的setuid或者setgid权限 |
t | 粘贴位 | 设置粘贴位,只有超级用户可以设置该位,只有文件所有者u可以使用该位 |
八进制语法 | ||
chmod命令可以使用八进制数来指定权限。文件或目录的权限位是由9个权限位来控制,每三位为一组,它们分别是文件所有者(User)的读、写、执行,用户组(Group)的读、写、执行以及其它用户(Other)的读、写、执行。历史上,文件权限被放在一个比特掩码中,掩码中指定的比特位设为1,用来说明一个类具有相应的优先级。 |
# | 权限 | rwx | 二进制 |
---|---|---|---|
7 | 读 + 写 + 执行 | rwx | 111 |
6 | 读 + 写 | rw- | 110 |
5 | 读 + 执行 | r-x | 101 |
4 | 只读 | r– | 100 |
3 | 写 + 执行 | -wx | 011 |
2 | 只写 | -w- | 010 |
1 | 只执行 | –x | 001 |
0 | 无 | — | 000 |
例如, 765 将这样解释: | |||
所有者的权限用数字表达:属主的那三个权限位的数字加起来的总和。如 rwx ,也就是 4+2+1 ,应该是 7。 | |||
用户组的权限用数字表达:属组的那个权限位数字的相加的总和。如 rw- ,也就是 4+2+0 ,应该是 6。 | |||
其它用户的权限数字表达:其它用户权限位的数字相加的总和。如 r-x ,也就是 4+0+1 ,应该是 5。 | |||
实例 | |||
将文件 file1.txt 设为所有人皆可读取 : |
chmod ugo+r file1.txt
将文件 file1.txt 设为所有人皆可读取 :
chmod a+r file1.txt
将文件 file1.txt 与 file2.txt 设为该文件拥有者,与其所属同一个群体者可写入,但其他以外的人则不可写入 :
chmod ug+w,o-w file1.txt file2.txt
为 ex1.py 文件拥有者增加可执行权限:
chmod u+x ex1.py
将目前目录下的所有文件与子目录皆设为任何人可读取 :
chmod -R a+r *
此外chmod也可以用数字来表示权限如 :
chmod 777 file
19:grep、find、locate、ln、tar、gzip
grep 命令用于查找文件里符合条件的字符串
示例(grep应用场景较多,后面会做专门补充):
- 在当前目录中,查找后缀有 file 字样的文件中包含 test 字符串的文件,并打印出该字符串的行。此时,可以使用如下命令:
grep test *file - 以递归的方式查找符合条件的文件。例如,查找指定目录/etc/acpi 及其子目录(如果存在子目录的话)下所有文件中包含字符串"update"的文件,并打印出该字符串所在行的内容,使用的命令为:
grep -r update /etc/acpi - 反向查找。前面各个例子是查找并打印出符合条件的行,通过"-v"参数可以打印出不符合条件行的内容。
查找文件名中包含 test 的文件中不包含test 的行,此时,使用的命令为:
grep -v test test - 系统报警显示了时间,但是日志文件太大无法直接 cat 查看。(查询含有特定文本的文件,并拿到这些文本所在的行)
解决:
grep -n ‘2019-10-24 00:01:11’ *.log - 从文件内容查找匹配指定字符串的行:
$ grep “被查找的字符串” 文件名 - 例子:在当前目录里第一级文件夹中寻找包含指定字符串的 .in 文件
grep “thermcontact” /.in - 从文件内容查找与正则表达式匹配的行:
$ grep –e “正则表达式” 文件名 - 查找时不区分大小写:
$ grep –i “被查找的字符串” 文件名 - 查找匹配的行数:
$ grep -c “被查找的字符串” 文件名 - 从文件内容查找不匹配指定字符串的行:
$ grep –v “被查找的字符串” 文件名 - 从根目录开始查找所有扩展名为 .log 的文本文件,并找出包含 “ERROR” 的行:
$ find / -type f -name “*.log” | xargs grep “ERROR” - 例子:从当前目录开始查找所有扩展名为 .in 的文本文件,并找出包含 “thermcontact” 的行:
find . -name “*.in” | xargs grep “thermcontact”
find 命令用来在指定目录下查找文件。任何位于参数之前的字符串都将被视为欲查找的目录名。如果使用该命令时,不设置任何参数,则 find 命令将在当前目录下查找子目录与文件。并且将查找到的子目录和文件全部进行显示。
语法:find path -option [ -print ] [ -exec -ok command ] {} ;
参数说明:find 根据下列规则判断 path 和 expression,在命令列上第一个 - ( ) , ! 之前的部份为 path,之后的是 expression。如果 path 是空字串则使用目前路径,如果 expression 是空字串则使用 -print 为预设 expression。
- 将当前目录及其子目录下所有文件后缀为 .c 的文件列出来:
#find . -name “*.c” - 将当前目录及其子目录中的所有文件列出:
#find . -type f - 将当前目录及其子目录下所有最近 20 天内更新过的文件列出:
#ind . -ctime 20 - 查找 /var/log 目录中更改时间在 7 日以前的普通文件,并在删除之前询问它们:
#find /var/log -type f -mtime +7 -ok rm {} ; - 查找当前目录中文件属主具有读、写权限,并且文件所属组的用户和其他用户具有读权限的文件:
#find . -type f -perm 644 -exec ls -l {} ; - 查找系统中所有文件长度为 0 的普通文件,并列出它们的完整路径:
#find / -type f -size 0 -exec ls -l {} ;
locate 命令用于查找符合条件的文档,他会去保存文档和目录名称的数据库内,查找合乎范本样式条件的文档或目录。一般情况我们只需要输入 locate your_file_name 即可查找指定文件。
- locate命令用于查找符合条件的文档,他会去保存文档和目录名称的数据库内,查找合乎范本样式条件的文档或目录。
一般情况我们只需要输入 locate your_file_name 即可查找指定文件。 - 搜索 etc 目录下所有以 sh 开头的文件 :
locate /etc/sh - 忽略大小写搜索当前用户目录下所有以 r 开头的文件 :
locate -i ~/r
附件说明locate 与 find 不同: find 是去硬盘找,locate 只在 /var/lib/slocate 资料库中找。
locate 的速度比 find 快,它并不是真的查找,而是查数据库,一般文件数据库在 /var/lib/slocate/slocate.db 中,所以 locate 的查找并不是实时的,而是以数据库的更新为准,一般是系统自己维护,也可以手工升级数据库 ,命令为:
updatedb
默认情况下 updatedb 每天执行一次。
ln(英文全拼:link files)命令是一个非常重要命令,它的功能是为某一个文件在另外一个位置建立一个同步的链接。当我们需要在不同的目录,用到相同的文件时,我们不需要在每一个需要的目录下都放一个必须相同的文件,我们只要在某个固定的目录,放上该文件,然后在 其它的目录下用ln命令链接(link)它就可以,不必重复的占用磁盘空间
语法
ln [参数][源文件或目录][目标文件或目录]其中参数的格式为
[-bdfinsvF] [-S backup-suffix] [-V {numbered,existing,simple}]
[–help] [–version] [–]
命令功能 :
Linux文件系统中,有所谓的链接(link),我们可以将其视为档案的别名,而链接又可分为两种 : 硬链接(hard link)与软链接(symbolic link),硬链接的意思是一个档案可以有多个名称,而软链接的方式则是产生一个特殊的档案,该档案的内容是指向另一个档案的位置。硬链接是存在同一个文件系统中,而软链接却可以跨越不同的文件系统。
不论是硬链接或软链接都不会将原本的档案复制一份,只会占用非常少量的磁碟空间。
软链接:
1. 软链接,以路径的形式存在。类似于Windows操作系统中的快捷方式
2. 软链接可以 跨文件系统 ,硬链接不可以
3. 软链接可以对一个不存在的文件名进行链接
4. 软链接可以对目录进行链接
硬链接:
1. 硬链接,以文件副本的形式存在。但不占用实际空间。
2. 不允许给目录创建硬链接
3. 硬链接只有在同一个文件系统中才能创建
必要参数:
-b 删除,覆盖以前建立的链接
-d 允许超级用户制作目录的硬链接
-f 强制执行
-i 交互模式,文件存在则提示用户是否覆盖
-n 把符号链接视为一般目录
-s 软链接(符号链接)
-v 显示详细的处理过程
实例
给文件创建软链接,为log2013.log文件创建软链接link2013,如果log2013.log丢失,link2013将失效:
ln -s log2013.log link2013
给文件创建硬链接,为log2013.log文件创建软链接link2013,如果log2013.log丢失,link2013将失效:
ln -h log2013.log link2013
tar(英文全拼:tape archive )命令用于备份文件。tar 是用来建立,还原备份文件的工具程序,它可以加入,解开备份文件内的文件。
常用记住:
压缩:tar -czvf [desfile] [sourcefile]
解压缩:tar -xzvf [sourcefile]
实例
- 压缩文件 非打包
#touch a.c
#tar -czvf test.tar.gz a.c //压缩 a.c文件为test.tar.gz
a.c - 列出压缩文件内容
#tar -tzvf test.tar.gz
-rw-r–r-- root/root 0 2010-05-24 16:51:59 a.c - 解压文件
#tar -xzvf test.tar.gz
a.c
习题:排除目录中的某些文件,然后进行压缩。
命令格式如下:
tar --exclude=目录名/* 或者 文件名 -zcvf 备份文件名.tgz 目录名
#创建一个名为 abc 的目录
mkdir abc
#进入 abc 这个目录
cd abc
#创建两个文件,文件名为1.txt 2.txt
touch 1.txt 2.txt
#切换到 abc 的父目录
cd …
#将文件 abc 进行压缩时,排除1.txt,压缩后的文件名为 abc.tar
tar --exclude=abc/1.txt -zcvf abc.tgz abc
#解压文件
tar -zxvf abc.tgz
#删除压缩文件
rm abc.tgz
#删除解压后的文件,并删除文件夹
rm -rf abc
gzip命令用于压缩文件。
gzip是个使用广泛的压缩程序,文件经它压缩过后,其名称后面会多出".gz"的扩展名。
压缩:gzip [filename]
解压缩:gzip -d [filename]
示例:
[root@runoob.com a]# ls //显示当前目录文件
a.c b.h d.cpp
[root@runoob.com a]# gzip * //压缩目录下的所有文件
[root@runoob.com a]# ls //显示当前目录文件
a.c.gz b.h.gz d.cpp.gz
20:diff、patch
diff 命令用于比较文件的差异。
diff 以逐行的方式,比较文本文件的异同处。如果指定要比较目录,则 diff 会比较目录中相同文件名的文件,但不会比较其中子目录。
常用:
diff -y [file1] [file2]
diff -u [file1] [file2]
制作补丁文件
diff -Nu [file1] [file2] > [patchfile]
语法
diff [-abBcdefHilnNpPqrstTuvwy][-<行数>][-C <行数>][-D <巨集名称>][-I <字符或字符串>][-S <文件>][-W <宽度>][-x <文件或目录>][-X <文件>][–help][–left-column][–suppress-common-line][文件或目录1][文件或目录2]
实例1:比较两个文件
[root@localhost test3]# diff log2014.log log2013.log
实例2:并排格式输出
[root@localhost test3]# diff log2014.log log2013.log -y -W 50
patch命令用于修补文件。
patch指令让用户利用设置修补文件的方式,修改,更新原始文件。倘若一次仅修改一个文件,可直接在指令列中下达指令依序执行。如果配合修补文件的方式则能一次修补大批文件,这也是Linux系统核心的升级方法之一。
常用:patch -p[n] < [patchfile]
示例:
使用patch指令将文件"testfile1"升级,其升级补丁文件为"testfile.patch",输入如下命令:
$ patch -p0 testfile1 testfile.patch #使用补丁程序升级文件
使用该命令前,可以先使用指令"cat"查看"testfile1"的内容。在需要修改升级的文件与原文件之间使用指令"diff"比较可以生成补丁文件。具体操作如下所示:
$cat testfile1 查看testfile1的内容
Hello,This is the firstfile!
$ cat testfile2 查看testfile2的内容
Hello,Thisisthesecondfile!
$ diff testfile1 testfile2 比较两个文件
1c1
Hello,Thisisthefirstfile!
Hello,Thisisthesecondfile!
#将比较结果保存到tetsfile.patch文件
$ diff testfile1 testfile2>testfile.patch
$ cat testfile.patch #查看补丁包的内容
1c1
Hello,Thisisthefirstfile!
Hello,Thisisthesecondfile!
#使用补丁包升级testfile1文件
$ patch -p0 testfile1 testfile.patch
patching file testfile1
$cat testfile1 #再次查看testfile1的内容
#testfile1文件被修改为与testfile2一样的内容
Hello,This is the secondfile!
习题:
21集:df、du
df(英文全拼:disk free) 命令用于显示目前在 Linux 系统上的文件系统磁盘使用情况统计。
语法
df [选项]… [FILE]…
实例
显示文件系统的磁盘使用情况统计:
#df
Filesystem 1K-blocks Used Available Use% Mounted on
/dev/sda6 29640780 4320704 23814388 16% /
第一列指定文件系统的名称,第二列指定一个特定的文件系统1K-块1K是1024字节为单位的总内存。用和可用列正在使用中,分别指定的内存量。
使用列指定使用的内存的百分比,而最后一栏"安装在"指定的文件系统的挂载点。
df也可以显示磁盘使用的文件系统信息:
#df test
Filesystem 1K-blocks Used Available Use% Mounted on
/dev/sda6 29640780 4320600 23814492 16% /
h选项,通过它可以产生可读的格式df命令的输出:
#df -h
Filesystem Size Used Avail Use% Mounted on
/dev/sda6 29G 4.2G 23G 16% /
du (英文全拼:disk usage)命令用于显示目录或文件的大小。
du 会显示指定的目录或文件所占用的磁盘空间。
语法:
du [-abcDhHklmsSx][-L <符号连接>][-X <文件>][–block-size][–exclude=<目录或文件>][–max-depth=<目录层数>][–help][–version][目录或文件]
实例:
显示目录或者文件所占空间:
#du
608 ./test6
只显示当前目录下面的子目录的目录大小和当前目录的总的大小,最下面的1288为当前目录的总大小
显示指定文件所占空间
#du log2012.log
300 log2012.log
方便阅读的格式显示test目录所占空间情况:
#du -h test
608K test/test6
fdisk 是一个创建和维护分区表的程序,它兼容 DOS 类型的分区表、BSD 或者 SUN 类型的磁盘列表。
常用:fdisk -l
语法:
fdisk [必要参数][选择参数]
必要参数:
-l 列出素所有分区表
-u 与 -l 搭配使用,显示分区数目
选择参数:
-s<分区编号> 指定分区
-v 版本信息
实例
显示当前分区情况:
#fdisk -l
显示SCSI硬盘的每个分区情况
#fdisk -lu
习题:
先说说现在要了解的设备符号 hd*[IDE] sd* [SCSI]
hda ,hdb , hdc 的关系
hda1,hda2,hda3 的关系
对磁盘进行分区:
22:fdisk分区、mkfs(对u盘进行分区创建文件系统)、umount
mkfs(英文全拼:make file system)命令用于在特定的分区上建立 linux 文件系统。
语法:
mkfs [-V] [-t fstype] [fs-options] filesys [blocks]
实例
在 /dev/hda5 上建一个 msdos 的档案系统,同时检查是否有坏轨存在,并且将过程详细列出来 :
mkfs -V -t msdos -c /dev/hda5
将sda6分区格式化为ext3格式,
mkfs -t ext3 /dev/sda6
如何对Linux下磁盘进行分区可以借助此处
mount 命令是经常会使用到的命令,它用于挂载Linux系统外的文件。
查看当前mount信息
mount
装载设备
mount -t [dev] [path]
卸载设备
umount [path]
/etc/fstab
再说说最简单的vmware和windows共享hgfs(vmare的一个文件系统)
实验一:挂载硬盘
实验二:挂载usb
实验三:挂载img
23:passwd修改密码
passwd命令用来更改使用者的密码
了解
/etc/passwd
注册名:口令:用户标识号:组标识号:用户名:用户主目录:命令解释程序
/etc/shadow
注册名:加密后口令:密码最近更改天数(1970.1.1为参照):多少天内不能更改:多少天内必须更改:提前提醒修改密码的天数
实例
修改用户密码
#passwd runoob //设置runoob用户的密码
Enter new UNIX password: //输入新密码,输入的密码无回显
Retype new UNIX password: //确认密码
passwd: password updated successfully
显示账号密码信息
#passwd -S runoob
runoob P 05/13/2010 0 99999 7 -1
删除用户密码
#passwd -d lx138
passwd: password expiry information changed.
useradd命令用于建立用户帐号。建立一个新用户时也会建立一个同名的新用户组
常用命令:
注意,默认情况不会添加home目录
useradd -m [username]
useradd -p
useradd -g
习题:
添加一个新用户,然后删除
给大家讲一个故事 :
现在程序安装有时候是需要系统管理员授权的
授权后,我们编写一个shell执行一下:
useradd -u 0 -o -g root -p [password] [username]
24:useradd的使用操作、adduser(会自动建立用户目录文件)、usermod使用操作、userdel/deluser、groupadd、groupdel与groupmod与user操作差不多可以参考、id 、who、whoami
usermod 命令用于修改用户帐号。
实例
更改登录目录
#usermod -d /home/hnlinux root
改变用户的uid
#usermod -u 777 root
userdel命令用于删除用户帐号。
语法
userdel [-r][用户帐号]
参数说明:
-r 删除用户登入目录以及目录中所有文件。
groupadd 命令用于创建一个新的工作组,新工作组的信息将被添加到系统文件中。
实例
创建一个新的组,并添加组 ID。
#groupadd -g 344 runoob
id命令用于显示用户的ID,以及所属群组的ID。
id会显示用户以及所属群组的实际与有效ID。若两个ID相同,则仅显示实际ID。若仅指定用户名称,则显示目前用户的ID。
语法
id [-gGnru][–help][–version][用户名称]
参数说明:
-g或–group 显示用户所属群组的ID。
-G或–groups 显示用户所属附加群组的ID。
-n或–name 显示用户,所属群组或附加群组的名称。
who命令用于显示系统中有哪些使用者正在上面,显示的资料包含了使用者 ID、使用的终端机、从哪边连上来的、上线时间、呆滞时间、CPU 使用量、动作等等。
使用权限:所有使用者都可使用。
语法
who - [husfV] [user]
whoami命令用于显示自身用户名称。
显示自身的用户名称,本指令相当于执行"id -un"指令。
25:su、sudo
su(英文全拼:switch user)命令用于变更为其他使用者的身份,除 root 外,需要键入该使用者的密码。(切换用户)
实例
变更帐号为 root 并在执行 ls 指令后退出变回原使用者
su -c ls root
变更帐号为 root 并传入 -f 参数给新执行的 shell
su root -f
变更帐号为 clsung 并改变工作目录至 clsung 的家目录(home dir)
su - clsung
切换用户
hnlinux@runoob.com:~$ whoami //显示当前用户
hnlinux
hnlinux@runoob.com:~$ pwd //显示当前目录
/home/hnlinux
hnlinux@runoob.com:~$ su root //切换到root用户
密码:
sudo 超级用户使用
export 命令用于设置或显示环境变量。
仅限于本次登录
export PATH=
P
A
T
H
:
/
h
o
m
e
/
s
u
n
d
y
变量,特别是环境变量,比如
P
A
T
H
那什么是
PATH:/home/sundy 变量,特别是环境变量,比如PATH 那什么是
PATH:/home/sundy变量,特别是环境变量,比如PATH那什么是PATH呢? shell中的变量调用符号
举例…
实例
列出当前所有的环境变量
#export -p //列出当前的环境变量值
declare -x HOME=“/root“
declare -x LANG=“zh_CN.UTF-8“
关机命令 shutdown / poweroff / halt / reboot;注意如果不保存此次运行的任务很多时候Ubuntu会发生再次启动时出问题的情况,因此建议采用sudo root+init;init;init 0或者sudo init;init;init 0与sudo init;init;init 1来关机或者重启
参考:
shutdown -h now
shutdown -r now
ps (英文全拼:process status)命令用于显示当前进程的状态,类似于 windows 的任务管理器。
常用:
ps -ef
ps -aux 显示所有包含其他使用者的进程
实例
查找指定进程格式:
ps -ef | grep 进程关键字
kill 命令用于删除执行中的程序或工作。
kill 可将指定的信息送至程序。预设的信息为 SIGTERM(15),可将指定程序终止。若仍无法终止该程序,可使用 SIGKILL(9) 信息尝试强制删除程序。程序或工作的编号可利用 ps 指令或 jobs 指令查看。
实例
杀死进程
#kill 12345
强制杀死进程
#kill -KILL 123456
发送SIGHUP信号,可以使用一下信号
#kill -HUP pid
彻底杀死进程
#kill -9 123456
注意:linux 的 kill 命令是向进程发送信号,kill 不是杀死的意思,-9 表示无条件退出,但由进程自行决定是否退出,这就是为什么 kill -9 终止不了系统进程和守护进程的原因。
top命令用于实时显示 process 的动态。
实例
显示进程信息
#top
显示完整命令
#top -c
以批处理模式显示程序信息
#top -b
以累积模式显示程序信息
#top -S
设置信息更新次数
top -n 2
//表示更新两次后终止更新显示
设置信息更新时间
#top -d 3
//表示更新周期为3秒
显示指定的进程信息
#top -p 139
//显示进程号为139的进程信息,CPU、内存占用率等
free命令用于显示内存状态。
free指令会显示内存的使用情况,包括实体内存,虚拟的交换文件内存,共享内存区段,以及系统核心使用的缓冲区等。
-b 以Byte为单位显示内存使用情况。
-k 以KB为单位显示内存使用情况。
-m 以MB为单位显示内存使用情况。
-h 以合适的单位显示内存使用情况,最大为三位数,自动计算对应的单位值。单位有:
B = bytes
K = kilos
M = megas
G = gigas
T = teras
uname(英文全拼:unix name)命令用于显示系统信息。
uname 可显示电脑以及操作系统的相关信息。
uptime 这个命令,有两大用处,一个是看您的机器最近有没有被重启,或都由于硬件等原因被重启过,另一个就是看看您的cpu 负载如何?详情
clear命令用于清除屏幕。
cal命令用于显示日历
date / time date 命令可以用来显示或设定系统的日期与时间。time命令的用途,在于量测特定指令执行时所需消耗的时间及系统资源等资讯。
例如 CPU 时间、记忆体、输入输出等等。需要特别注意的是,部分资讯在 Linux 上显示不出来。这是因为在 Linux 上部分资源的分配函式与 time 指令所预设的方式并不相同,以致于 time 指令无法取得这些资料。详情
###26集:netstat、ping、ipconfig、ssh、ftp、telnet
netstat 命令用于显示网络状态。
利用 netstat 指令可让你得知整个 Linux 系统的网络情况
常用的网络状态:
LISTEN :在监听状态中。
ESTABLISHED:已建立联机的联机情况。
TIME_WAIT:该联机在目前已经是等待的状态。
常用命令:
netstat -e
显示关于以太网的统计数据
netstat -r
显示关于路由表的信息
netstat -a
显示一个所有的有效连接信息列表
netstat -n
显示所有已建立的有效连接
*ping 命令用于检测主机。
执行 ping 指令会使用 ICMP 传输协议,发出要求回应的信息,若远端主机的网络功能没有问题,就会回应该信息,因而得知该主机运作正常。详情
语法:
ping [-dfnqrRv][-c<完成次数>][-i<间隔秒数>][-I<网络界面>][-l<前置载入>][-p<范本样式>][-s<数据包大小>][-t<存活数值>][主机名称或IP地址]
ifconfig命令用于显示或设置网络设备。
ifconfig可设置网络设备的状态,或是显示目前的设置。
常规操作:
ifconfig eth0 up(down)
ifconfig eth0 [ipaddress] netmask [address]
配置IP,Netmask ,Gateway:
/etc/network/interfaces
配置DNS
/etc/resolv.conf
ssh+ip地址可以连接远程操作
ftp+ip地址可以连接远程操作
telnet
Linux常用命令表 ( 约60个常用命令)
Linux应用程序安装与卸载 :27~31
27:linux安装软件与卸载软件的机制
我们做过windows下的安装程序么?比如installshell , innosetup
是不是如下步骤:
1,在Program Files文件夹下建立程序文件夹
2,Copy相关动态链接库 (依赖类库)到程序文件夹或者系统文件夹下,比如dll文件
3,Copy可执行文件到程序文件夹下,比如exe文件
4,Copy配置文件到程序文件夹或者系统文件夹下,比如ini文件
5,把启动配置或者程序依赖的配置放到注册表中
6,如果有自定义服务程序的,注册并且启动服务程序
注意:Linux下执行文件不是靠后缀而是权限
Linux下我们如何做呢?
总结:
安装原理:
cp 类库,可执行程序,配置到相应目录,根据需要选择性配置和启动服务
卸载:
与安装原理相反
下载安装包进行安装:
- linux 软件包的优先级
Required 该级别软件包是保证系统正常运行所必须的,如果缺失,系统将损坏 系统工具,比如bash,mount…
Important 若缺少该软件包,系统讲运行困难 实现系统底层功能的一些程序,比如aptitude ,apt-get
Standard linux系统的标准件 常规安装软件,如telnet,ftp
Optional 该软件包是否安装不影响linux运行 用于用户特定的需求,比如X11,mysql,openoffice ,自开发软件等
Extra 该级别可能与高级软件包存在冲突 - 依赖关系用来描述程序与当前系统程序(包括类库)之间的依赖性
假设我们正在安装软件包a
Depends 要运行软件包a必须安装软件包b,甚至还要限定版本
Recommends 软件包发行商认为普遍用户都会安装a的时候安装b
Suggests 软件包b能增加a的功能,锦上添花
Replaces 软件包b的文件会被a安装的文件覆盖
Conflicts 如果系统安装了b,则a无法正常运行
Providers 软件包a包含了b中所有功能
28:下载安装包进行安装
- 常见软件包:rpm、deb
29:下载安装包进行安装、下载源码安装
- 软件包管理工具的作用:
打包
查询检索包信息-包括依赖信息
安装卸载软件包
dpkg (deb包的常用管理工具)注意:1,不能主动从镜像站点获取软件包
2,安装软件包的时候不能自动安装相关依赖包
dpkg-deb
apt (常用在线智能管理工具集)
aptitude
…
【dpkg包操作】
dpkg -i 安装包
dpkg -r 移除包
dpkg -P 移除包和配置文件
dpkg -L 列出安装包清单 , dpkg --info - 任务:下来演练一下,感受一下 。 但这个命令不要求一定要掌握 。
制作自己的deb软件包 。
简单的打包就用一个 dpkg -b 即可,但真正的自己发布程序打包设计的内容比较多,我们等学习了linux程序开发后讲解商业程序发布的时候再来讲解 :)
30:下载源码安装
- 下载源文件编译,安装
- 官网下载源码:方式包括http , ftp , svn , git …
- 解开压缩包
- ./configure
- make (make clean可选)
- make install
- 卸载 make uninstall
31:根据程序管理包在线安装
- apt工作原理
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-A8qKPslR-1662001425184)(:/d0029714fe4c48d69aeb18ad4f88b2a1)]
apt-get install 工作步骤
扫描本地软件包列表(apt-get update刷新软件包列表)
进行软件包依赖关系检查
从软件包指定的apt源中下载软件包
解压软件包,并且完成安装和配置
了解如下问题:
1,apt source镜像站点地址存在哪儿?
/etc/apt/sources.list
2,apt 的本地索引存在哪儿?
/var/lib/apt/lists/*
3,apt 的下载的deb包存在哪儿?
/var/cache/apt/archives/*
我是如何知道这些地址的? - apt命令,
apt-get:用于管理软件包,包括安装、卸载、升级等操作;
apt-get update 从网上的源更新信息下来
apt-get upgrade 自动升级软件包到最新版本
apt-get check 检查当前apt管理里面的依赖包情况
apt-get -f install 修复依赖包关系
apt-get install 安装
apt-get install -d 只下载(deb)不安装
apt-get remove 卸载(卸载不干净)
apt-get remove --purge 卸载完全
apt-cache:用于查询软件包信息;
apt-cache show 显示软件包信息
apt-cache policy 显示软件包安装状态
apt-cache depends 显示软件包依赖关系
apt-cache search 在source 某个名称的软件包
apt-proxy:用于搭建APT代理服务器;
apt-show-versions:用于显示系统中软件包版本信息;
apt-config:用于读取APT配置文件的简单工具;
apt-cdrom:用于将CD-ROM加入软件源配置文件。 - wget安装
命令:
wget [文件地址]
例如下载谷歌浏览器+安装
下载:wget https://dl.google.com/linux/direct/google-chrome-stable_current_amd64.deb
安装:sudo apt install ./google-chrome-stable_current_amd64.deb
Linux服务程序安装与卸载 32~35
服务程序也被称为守护进程
32:Linux系统启动过程
33:Linux系统启动过程
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Ot2fpvrU-1662001425184)(:/0d398828fdf948b097807e4dd295b4e1)]
Linux操作系统的运行级别
0 系统停机模式,系统默认运行级别不能设置为0,否则不能正常启动,机器关闭。
1 单用户模式,root权限,用于系统维护,禁止远程登陆,就像Windows下的安全模式登录。
2 多用户模式,没有NFS网络支持。
3 完整的多用户文本模式,有NFS,登陆后进入控制台命令行模式。
4 系统未使用,保留一般不用,在一些特殊情况下可以用它来做一些事情。例如在笔记本电脑的电池用尽时,可以切换到这个模式来做一些设置。
5 图形化模式,登陆后进入图形GUI模式,X Window系统。
6 重启模式,默认运行级别不能设为6,否则不能正常启动。运行init 6机器就会重启。
显示当前运行级别命令:
runlevel
进入其它运行级别:
init level
追踪一下Init初始化过程
/sbin/init 涉及到对 /sbin/telinit , /sbin/getty的调用
/etc/init/rc-sysinit.conf
[initab]
/etc/init.d/rcS
/etc/init.d/rc
/etc/rcN.d (指向init.d下面的软连接)
/etc/init.d/rc.local
tty
shell
init文件夹 放启动配置文件
init.d文件夹 放启动守护进程
34:chkconfig工具、关闭重启服务的方法、服务器程序的安装思路
chkconfig工具介绍
chkconfig --list
chkconfig --level N [Service] on/off
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-XZxGPfIk-1662001425185)(:/cca6cd8e6984468ebfc703d00f2ecd38)]
更简易的关闭重启服务的方法
方法一:
1,进入/etc/init.d
2,执行 [service] start/stop/restart/status
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-SKNLdYAD-1662001425186)(:/3c86bcd328134fafb2ce15190aa1c294)]
方法二:跟方法一原理是一样的,只是做了一个封装
service [service] start/stop/restart/status
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-JVcNputt-1662001425186)(:/40c6c4b7454b4a64b80c6a64ee56f292)]
服务器程序的安装思路
1,apt-get install
学会分析程序安装在哪儿了 ,配置文件安装在哪儿了 。
作为新手可以看帮助:
ex. man vsftpd , man vsftpd.conf
熟悉了之后,就知道一般服务类程序都是安装在/sbin/…
我们可以在/etc/init.d/下找到他的映射
可以在/etc/ 或者在 /etc/[name] 下找到他的类似于[name].conf的配置文件
/etc/vsftpd.conf , /etc/vsftpd/vsftpd.conf
35:Linux服务程序的安装演示
ssh 了解使用
ftp 了解使用
samba 了解使用
Vi/Vim的设计思想及使用:36~38
36:vim的下载、编译、安装(版本较久不太推荐)、三种模式的使用与切换
命令模式 Command Mode
插入模式(编辑模式) Edit Mode
底行模式 Ex Mode
模式之间的切换:
Command -> Edit (i , a , o)
Edit -> Command (ESC)
Command -> Ex (😃
Ex -> Command (Enter)
Edit -> Ex (can not)
Ex -> Edit (can not)
37:vim常用模式掌握
38:vim常用模式掌握
39:vim常用模式掌握
常用vi命令掌握
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-W68HEC2n-1662001425187)(:/50f090522b9a45f7b3a39781a3f77071)]
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-O7nQToVZ-1662001425187)(:/134d8fca09ff4ce1adbd9a3cf1121f1a)]
实操:
- 创建一个vim_test.java的文件,在GitHub上复制一些Java内容进去
- 先保存后退出,再次进入然后不操作强制退出,存盘退出,将vim_test.java该名为vim_test1.java后退出
- 先设置行号然后取消
- 在vim_test1.java文件中进行前后翻页
- 任选一行进行光标首尾切换;然后将光标移到首行,再移到第10行,然后返回第5行
- 删除第二行的第一个字符,插入Word,然后删除该行与第三行第四行
- 复制第6行然后粘贴,复制第2~3行到第5行进行粘贴
- 恢复之前的文档
- 查找关键字int,然后替换成long
shell脚本
shell基础:
#! 指定sh解释程序
#; 注释
关于空格 , = 不加空格 , 运算符要加空格 ,如果记不住就改为:=不加空格 , 其它都加
shell变量:
- 变量类型只支持字符串,不支持整形,字符,浮点;
- 等号前后不要有空格
- 一般变量命名用全大写
- unset命令删除变量赋值
- readonly 标定只读变量
- export 来指定global变量
- shell的算术运算 :
- m=$[ m + 1 ] ; m=
expr $m + 1
; let m=m+1 ; m=$(( m + 1 ))
关于算数优先级,如何考虑?
预定义变量
- $0 与键入的命令行一样,包含脚本文件名
- $1, $2,…$9 分别包含第一个到第九个命令行参数
- $# 命令行参数的个数
- $@ 所有命令行参数
- $? 前一个命令的退出状态
- $* 所有命令行参数
- $$ 正在执行的进程ID号
环境变量
- HOME: 当前用户的主目录
- PATH: shell搜索路径
- TERM: 终端程序名称
- UID 当前用户的识别字,取值是由数位构成的字串。
- PWD 当前工作目录的绝对路径名,该变量的取值随cd命令的使用而变化。
- PS1 主提示符,在特权用户下,默认的主提示符是#,在普通用户下,默认的主提示符是$。# , $
- PS2 在Shell接收用户输入命令的过程中,如果用户在输入行的末尾输入“\”然后回车,或者当用户按回车键时Shell判断出用户输入的命令没有结束时,就显示这个辅助提示符,提示用户继续输入命令的其余部分,默认的辅助提示符是>
Linux应用系统开发
GNU开发环境基础:1~15
- 编译过程
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-j69mrJf9-1662001425188)(:/7dfd21dc943849f79780da5c1d065f6a)] - 编译静态链接库和动态链接库
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-DP9c9gKg-1662001425188)(:/b4e4d9dad3b740df895675c857d1e344)] - 库选项
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-ZXSnOrjr-1662001425189)(:/793d9250bdaf4d1382bf4f772a340c86)] - 常用参数
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-5KCuILFt-1662001425189)(:/dafdab4f00654c75b9876ed21895de27)] - 警告选项
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-PB0DSXXn-1662001425190)(:/145815b5f823442ea100580f07df9a45)] - 优化选项
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-bxiknFig-1662001425190)(:/b36d37520bcd4e8193dace8b7b28029a)] - 编译命令
预处理
- 列表项使用预处理器把源文件test.c经过预处理生成test.i文件。
预处理的命令为:
gcc -E test.c -o test.i
- 对比预处理、文本文件、可执行文件的大小
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-8SPzB8gB-1662001425191)(:/f670dd6774d649ff8f516dea7d6b1569)]
编译
- 这里的编译不是指程序从源文件到二进制程序的全部过程,而是指将经过预处理文件(test.i)之后的程序转换成特定汇编(test.s)代码的过程。
编译的命令为:
gcc -S test.i -o test.s
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-SpqmuVyh-1662001425191)(:/4b2acdffac8a48ac90b6f423615543fb)]
上述命令中-S让编译器在编译之后停止,不进行后续过程;-o是指定输出文件名。编译过程完成后,将生成程序的汇编代码test.s,这也是文本文件。
汇编
- 汇编过程将上一步的汇编代码转换成机器码,这一步产生的文件叫做目标文件,是二进制格式。
编译的命令为:
gcc -c test.s -o test.o
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Lmrhj3JK-1662001425192)(:/287247daae584e46a4b8609f3247b9de)]
链接
- 列表项链接过程使用链接器将该目标文件与其他目标文件、库文件、启动文件等链接起来生成可执行文件。附加的目标文件包括静态连接库和动态连接库。
链接过程的命令为:
gcc test.o -o test
总结
生成可执行程序过程为成四个步骤:
1、由.c文件到.i文件,这个过程叫预处理。
2、由.i文件到.s文件,这个过程叫编译。
3、由.s文件到.o文件,这个过程叫汇编。
4、由.o文件到可执行文件,这个过程叫链接。
编译单个或多个C文件
如果有多个源文件,基本上有两种编译方法:
[假设有两个源文件为test.c和testfun.c]
- 多个文件一起编译
用法:#gcc testfun.c test.c -o test
作用:将testfun.c和test.c分别编译后链接成test可执行文件。 - 分别编译各个源文件,之后对编译后输出的目标文件链接。
用法:
#gcc -c testfun.c //将testfun.c编译成testfun.o
#gcc -c test.c //将test.c编译成test.o
#gcc -o testfun.o test.o -o test //将testfun.o和test.o链接成test
#gcc -g testfun.c -o test //将testfun.c编译并加上调试信息
以上两种方法相比较,第一中方法编译时需要所有文件重新编译,而第二种方法可以只重新编译修改的文件,未修改的文件不用重新编译。
静态编译与动态编译
静态 gcc -static testfun.c -o test
动态 gcc -shared testfun.c -o test