Linux快速复习之shell与开发环境搭建

文章目录

  • Linux驱动开发快速复习
    • Linux操作系统基础
        • 12:cat、ls、whereis用法
      • 13:GNU的来历
      • 14:bash的安装
      • 15:Linux与bash命令的实现原理
    • 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
      • 27:linux安装软件与卸载软件的机制
      • 28:下载安装包进行安装
      • 29:下载安装包进行安装、下载源码安装
      • 30:下载源码安装
      • 31:根据程序管理包在线安装
    • Linux服务程序安装与卸载 32~35
      • 32:Linux系统启动过程
      • 33:Linux系统启动过程
    • 34:chkconfig工具、关闭重启服务的方法、服务器程序的安装思路
    • 35:Linux服务程序的安装演示
    • Vi/Vim的设计思想及使用:36~38
      • 36:vim的下载、编译、安装(版本较久不太推荐)、三种模式的使用与切换
      • 37:vim常用模式掌握
      • 38:vim常用模式掌握
      • 39:vim常用模式掌握
      • shell脚本
    • 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

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)命令是控制用户对文件的权限的命令
    Linux快速复习之shell与开发环境搭建_第1张图片
    Linux快速复习之shell与开发环境搭建_第2张图片

只有文件所有者和超级用户可以修改文件或目录的权限。可以使用绝对模式(八进制数字模式),符号模式指定文件的权限。

Linux快速复习之shell与开发环境搭建_第3张图片

语法:chmod [-cfvR] [–help] [–version] mode file…
[ugoa…][[±=][rwxX]…][,…]

  1. u表示该文件的拥有者,g 表示与该文件的拥有者属于同一个群体(group)者,o 表示其他以外的人,a 表示这三者皆是。
    • 表示增加权限、- 表示取消权限、= 表示唯一设定权限。
  2. r 表示可读取,w 表示可写入,x 表示可执行,X 表示只有当该文件是个子目录或者该文件已经被设定过为可执行。
  3. 其他参数说明:
    -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应用场景较多,后面会做专门补充):

  1. 在当前目录中,查找后缀有 file 字样的文件中包含 test 字符串的文件,并打印出该字符串的行。此时,可以使用如下命令:
    grep test *file
  2. 以递归的方式查找符合条件的文件。例如,查找指定目录/etc/acpi 及其子目录(如果存在子目录的话)下所有文件中包含字符串"update"的文件,并打印出该字符串所在行的内容,使用的命令为:
    grep -r update /etc/acpi
  3. 反向查找。前面各个例子是查找并打印出符合条件的行,通过"-v"参数可以打印出不符合条件行的内容。
    查找文件名中包含 test 的文件中不包含test 的行,此时,使用的命令为:
    grep -v test test
  4. 系统报警显示了时间,但是日志文件太大无法直接 cat 查看。(查询含有特定文本的文件,并拿到这些文本所在的行)
    解决:
    grep -n ‘2019-10-24 00:01:11’ *.log
  5. 从文件内容查找匹配指定字符串的行:
    $ grep “被查找的字符串” 文件名
  6. 例子:在当前目录里第一级文件夹中寻找包含指定字符串的 .in 文件
    grep “thermcontact” /.in
  7. 从文件内容查找与正则表达式匹配的行:
    $ grep –e “正则表达式” 文件名
  8. 查找时不区分大小写:
    $ grep –i “被查找的字符串” 文件名
  9. 查找匹配的行数:
    $ grep -c “被查找的字符串” 文件名
  10. 从文件内容查找不匹配指定字符串的行:
    $ grep –v “被查找的字符串” 文件名
  11. 从根目录开始查找所有扩展名为 .log 的文本文件,并找出包含 “ERROR” 的行:
    $ find / -type f -name “*.log” | xargs grep “ERROR”
  12. 例子:从当前目录开始查找所有扩展名为 .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。

  1. 将当前目录及其子目录下所有文件后缀为 .c 的文件列出来:
    #find . -name “*.c”
  2. 将当前目录及其子目录中的所有文件列出:
    #find . -type f
  3. 将当前目录及其子目录下所有最近 20 天内更新过的文件列出:
    #ind . -ctime 20
  4. 查找 /var/log 目录中更改时间在 7 日以前的普通文件,并在删除之前询问它们:
    #find /var/log -type f -mtime +7 -ok rm {} ;
  5. 查找当前目录中文件属主具有读、写权限,并且文件所属组的用户和其他用户具有读权限的文件:
    #find . -type f -perm 644 -exec ls -l {} ;
  6. 查找系统中所有文件长度为 0 的普通文件,并列出它们的完整路径:
    #find / -type f -size 0 -exec ls -l {} ;

locate 命令用于查找符合条件的文档,他会去保存文档和目录名称的数据库内,查找合乎范本样式条件的文档或目录。一般情况我们只需要输入 locate your_file_name 即可查找指定文件。

  1. locate命令用于查找符合条件的文档,他会去保存文档和目录名称的数据库内,查找合乎范本样式条件的文档或目录。
    一般情况我们只需要输入 locate your_file_name 即可查找指定文件。
  2. 搜索 etc 目录下所有以 sh 开头的文件 :
    locate /etc/sh
  3. 忽略大小写搜索当前用户目录下所有以 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]

实例

  1. 压缩文件 非打包
    #touch a.c
    #tar -czvf test.tar.gz a.c //压缩 a.c文件为test.tar.gz
    a.c
  2. 列出压缩文件内容
    #tar -tzvf test.tar.gz
    -rw-r–r-- root/root 0 2010-05-24 16:51:59 a.c
  3. 解压文件
    #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]
示例:
[[email protected] a]# ls //显示当前目录文件
a.c b.h d.cpp
[[email protected] a]# gzip * //压缩目录下的所有文件
[[email protected] 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
在这里插入图片描述
注册名:口令:用户标识号:组标识号:用户名:用户主目录:命令解释程序
Linux快速复习之shell与开发环境搭建_第4张图片

/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
切换用户
[email protected]:~$ whoami //显示当前用户
hnlinux
[email protected]:~$ pwd //显示当前目录
/home/hnlinux
[email protected]:~$ 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快速复习之shell与开发环境搭建_第5张图片

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 类库,可执行程序,配置到相应目录,根据需要选择性配置和启动服务
卸载:
与安装原理相反

下载安装包进行安装:

  1. linux 软件包的优先级
    Required 该级别软件包是保证系统正常运行所必须的,如果缺失,系统将损坏 系统工具,比如bash,mount…
    Important 若缺少该软件包,系统讲运行困难 实现系统底层功能的一些程序,比如aptitude ,apt-get
    Standard linux系统的标准件 常规安装软件,如telnet,ftp
    Optional 该软件包是否安装不影响linux运行 用于用户特定的需求,比如X11,mysql,openoffice ,自开发软件等
    Extra 该级别可能与高级软件包存在冲突
  2. 依赖关系用来描述程序与当前系统程序(包括类库)之间的依赖性
    假设我们正在安装软件包a
    Depends 要运行软件包a必须安装软件包b,甚至还要限定版本
    Recommends 软件包发行商认为普遍用户都会安装a的时候安装b
    Suggests 软件包b能增加a的功能,锦上添花
    Replaces 软件包b的文件会被a安装的文件覆盖
    Conflicts 如果系统安装了b,则a无法正常运行
    Providers 软件包a包含了b中所有功能

28:下载安装包进行安装

  1. 常见软件包:rpm、deb

29:下载安装包进行安装、下载源码安装

  1. 软件包管理工具的作用:
    打包
    查询检索包信息-包括依赖信息
    安装卸载软件包
    dpkg (deb包的常用管理工具)注意:1,不能主动从镜像站点获取软件包
    2,安装软件包的时候不能自动安装相关依赖包

    dpkg-deb
    apt (常用在线智能管理工具集)
    aptitude

    【dpkg包操作】
    dpkg -i 安装包
    dpkg -r 移除包
    dpkg -P 移除包和配置文件
    dpkg -L 列出安装包清单 , dpkg --info
  2. 任务:下来演练一下,感受一下 。 但这个命令不要求一定要掌握 。
    制作自己的deb软件包 。
    简单的打包就用一个 dpkg -b 即可,但真正的自己发布程序打包设计的内容比较多,我们等学习了linux程序开发后讲解商业程序发布的时候再来讲解 :)

30:下载源码安装

  • 下载源文件编译,安装
  • 官网下载源码:方式包括http , ftp , svn , git …
  • 解开压缩包
  • ./configure
  • make (make clean可选)
  • make install
  • 卸载 make uninstall

31:根据程序管理包在线安装

  1. 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/*
    我是如何知道这些地址的?
  2. 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加入软件源配置文件。
  3. 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)]
实操:

  1. 创建一个vim_test.java的文件,在GitHub上复制一些Java内容进去
  2. 先保存后退出,再次进入然后不操作强制退出,存盘退出,将vim_test.java该名为vim_test1.java后退出
  3. 先设置行号然后取消
  4. 在vim_test1.java文件中进行前后翻页
  5. 任选一行进行光标首尾切换;然后将光标移到首行,再移到第10行,然后返回第5行
  6. 删除第二行的第一个字符,插入Word,然后删除该行与第三行第四行
  7. 复制第6行然后粘贴,复制第2~3行到第5行进行粘贴
  8. 恢复之前的文档
  9. 查找关键字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

  1. 编译过程
    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-j69mrJf9-1662001425188)(:/7dfd21dc943849f79780da5c1d065f6a)]
  2. 编译静态链接库和动态链接库
    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-DP9c9gKg-1662001425188)(:/b4e4d9dad3b740df895675c857d1e344)]
  3. 库选项
    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-ZXSnOrjr-1662001425189)(:/793d9250bdaf4d1382bf4f772a340c86)]
  4. 常用参数
    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-5KCuILFt-1662001425189)(:/dafdab4f00654c75b9876ed21895de27)]
  5. 警告选项
    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-PB0DSXXn-1662001425190)(:/145815b5f823442ea100580f07df9a45)]
  6. 优化选项
    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-bxiknFig-1662001425190)(:/b36d37520bcd4e8193dace8b7b28029a)]
  7. 编译命令

预处理

  • 列表项使用预处理器把源文件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]

  1. 多个文件一起编译
    用法:#gcc testfun.c test.c -o test
    作用:将testfun.c和test.c分别编译后链接成test可执行文件。
  2. 分别编译各个源文件,之后对编译后输出的目标文件链接。
    用法:
    #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

GNU开发环境基础:IO操作

你可能感兴趣的:(Linux驱动开发学习,linux,驱动开发,运维)