一、shell的简单使用
1、Shell的简单使用:$表示普通用户权限,#表示根用户(超级用户)权限。
在一个命令行可以置入多个命令,用分号将各个命令隔开,这些命令将按顺序执行。也可以在几个命令行中输入一个命令,用反斜杠将一个命令行持续到下一行。
2、通配符:
*:代表任意长度字符串。 ?:代表任何单个字符。 [ ]:指定了模式串匹配的字符范围。
3、引号:
单引号:引起来的字符都作为普通字符出现。
双引号:“$”,“\”,“`”这三种特殊字符不被忽略,双引号会解释字符串的特殊意义。
反引号:对应键在键盘左上角,反引号引起来的字符串被shell解释为命令行,shell首先执行该命令行,并以他的标准输出结果取代整个反引号部分。
4注释符:以字符#开头表示注释行。
5、“|”管道,将一个命令的输出直接连接到另一个命令的输入。
二、基本操作命令
A、与目录相关命令
1、浏览目录内容命令ls
-a显示所有文件及目录,包括隐藏文件和目录
-l将文件和目录详细的列出,包括文件状态、权限等
-R递归显示下层子目录
-help显示帮助信息
默认的情况下时当前的工作目录,也可以通过参数来指定
2、改变工作目录的命令cd
若路径以”/”开头,那么即是绝对路径
“.”表示当前路径;“…”表示当前工作目录的上一级目录;“~”表示当前使用shell用户的主文件夹;“~用户名”表示指定用户的主文件夹;“-”表示返回上次执行命令cd之前的目录;不带参数表示返回当前用户的主文件夹
3、显示当前目录绝对路径pwd
4、创建目录命令mkdir
mkdir 参数选项 目录名称
5、删除目录rmdir
6、目录拷贝 cp -r 源目录
目标目录 :将源目录整体拷贝到目标目录
B、与文件相关命令
1、显示文本文件内容命令cat
将文本的内容显示在屏幕上,或通过重新定向将文本文件的内容读取出来并写入其他文件。还可以同时显示多个文件。
2、分页命令less或more
显示文本的时候会将信息显示一屏之后就停顿下来,然后接受到显示下一屏的命令时在显示下一屏信息。
3、创建文件命令
touch newfile
或 echo > newfile (可同时将一行语句写进文本)
或 cat> newfile(然后进入文本模式,可以依此写很多语句进入文本,最后用Ctrl+D保存并退出)
4、复制文件和目录命令cp
cp 源文件 目标路径:将源文件粘贴到目标文件夹,源文件可以是多个文件
cp 源文件 目标文件:在当前文件夹创建源文件副本,名字为目标文件。
5、删除文件和目录命令rm
删除文件 rm 文件;删除目录 rm -r 目录
-i 提供了交互式删除模式,删除前进行询问。
6、移动文件和目录mv
mv 文件1 文件2 将一个文件从一个目录中移动到指定的目录中。若目标目录下不存在此文件,则创建,若存在同名文件,则已存在的目标文件会被覆盖。
选项-i 交互式询问是否重写
7、改变文件的权限属性chmod
chmod [选项] [文件|目录]
选项 : 权限设定字串,格式如下 : [ugoa…][[±=][rwxX]…][,…],其中
u 表示该档案的拥有者,g 表示与该档案的拥有者属于同一个群体(group)者,o 表示其他以外的人,a表示这三者皆是。
+ 表示增加权限、- 表示取消权限、= 表示唯一设定权限。
r 表示可读取,w 表示可写入,x 表示可执行
或者:chmod abc file
其中a,b,c各为一个数字,分别表示User、Group、及Other的权限。
r=4,w=2,x=1
若要rwx属性则4+2+1=7;
若要rw-属性则4+2=6;
若要r-x属性则4+1=7。
8、压缩、解压缩 tar
tar [选项] [tar的文件名] [文件列表]
压缩、解压缩tar格式的压缩包,制作备份恢复备份文件
-c: 建立压缩档案
-x:解压
-t:查看内容
-r:向压缩归档文件末尾追加文件
-u:更新原压缩包中的文件
这五个是独立的命令,压缩解压都要用到其中一个
-f 使用归档文件
例如:tar -cf archive.tar foo bar # Create archive.tar from files foo and bar.
9、匹配字符串命令grep
grep命令可以在文本内容里搜索与所给匹配模式匹配的文本行,并将文本行显示在屏幕上
grep [选项] 匹配模式 [文件列表]
10、排序命令sort
sort [选项] [文件列表]
常用选项-d 按字典顺序排序,比较时仅对字母数字空格和制表符有意义。
-f 忽略大小写
-r 按逆序排序输出排序结果
11、查看、修改或者执行某些命令需要root用户的权限。
如果不想直接切换到root用户,就可以使用sudo命令。sudo命令用于针对单个命令授予临时权限。使用方法是在原有命令之前加上sudo+空格。或者在命令行输入sudo su,你可以发现你的提示符哪里出现了root,输入符号变为#,这时候你就是root用户,即获得了管理员权限。
12、在终端用gedit打开特定系统文件
sudo gedit /etc/sysct1.d/10-ptrace.conf(/后为系统文件路径)
用Ctrl+C关闭gedit
C、帮助命令
1、显示命令的帮助信息命令man
使用man显示的命令手册都包括命令的语法、个每选项的意义以及相关命令等。
2、系统帮助命令help
用于查看所有系统shell命令
例如:grep --help #给出grep命令的帮助信息
3、查看命令所在位置信息的命令whereis
可以寻找指定命令所在的位置
4、查看GNU程序命令的帮助文档命令info
当命令info后接到一个指定命令时,屏幕会显示指定命令的信息手册页。按Q键退出手册,返回shell。按PgUp
PgDn翻页。按S键在手册中找到指定字符串。
5、一般程序员在设计命令时会拥有一个调用命令使用说明的选项一般为:
command –help 或 command -h
D、与网络相关命令
1、ping命令
ping 网络主机地址;功能:查看本机到网络上某一主机是否能够通讯
2、ifconfig命令
ifconfig 网卡名称;功能:配置网卡信息,如IP地址,子网掩码和默认网关
3、netstate命令
natstate [参数列表];功能:显示本机网络状态
-a 或 -all : 表示显示所有连接中的套接字Socket
4、telnet 命令
telnet 网络主机地址; 功能:远程登陆到网络上的某一服务器主机
E、常用快捷键
Ctrl+A 将光标移动到命令行开始的位置
Ctrl+E 将光标移动到命令行末尾的位置
Ctrl+D 删除当前光标位置字符
Ctrl+K 剪切光标到行末的字符串
Ctrl+U 剪切光标到行首的字符串
Ctrl+W 剪切光标前的一个单词
Ctrl+Y 粘贴最近剪切的字符串
Ctrl+C 删除整行,并换到下一行
三、gcc编译器与gdb调试器
预处理:处理宏定义,头文件包含,选择编译
编译:词法分析,语法分析,把代码翻译成汇编语言
汇编:把汇编语言译成机器语言
链接:链接函数库,分静态链接,动态链接。完成链接后,生成可执行文件。
A、GCC
1、编译文件
编译文件:gcc -o 输出文件名 被编译的文件名
执行编译成的文件:./编译时输出的文件名
2、警告
-Wall:使gcc产生尽可能多的警告信息,建议用gcc编译源代码时始终带上-Wall选项
-Werror:要求gcc 将所有的警告当成错误处理,gcc会在所有产生错误的地方停止编译。
-w:禁止所有报警
3、优化gcc
-O或-O1:优化代码,同时减小代码长度和执行时间
-O2 -O3 -O4:在完成上一级优化的同时再进一步进行优化,不过同时也需要更长的编译时间。程序员一般多用-O2优化
4、链接库
-I 选项可以向gcc的头文件搜素路径中添加新的目录
-L 选项可以想gcc的库文件搜素路径中添加新的目录
-library 链接名为library的库文件
例如“ gcc foo.c -L /home/chuanxia/lib -lfoo -o foo
其中Linux下的库文件命名的时候都以lib三个字母开头,-l选择指定链接的库文件名时可以省去lib三个字母,也就是说gcc 在对-lfoo进行处理时,会自动去链接名为libfoo.so的文件。
Linux下库文件分两大类,动态链接库(通常以.so结尾)和静态链接库(通常以.a结尾),默认情况优先使用动态链接库,动态链接库不存在时才考虑静态链接库,如需要强制使用静态链接库,可在编译时加上-static选项。
5、同时编译多个文件
例如:gcc fool1.c fool2.c fool3.c -o foo
6、-pipe管道
管道可以同时连接两个程序,以其中一个程序的输出直接作为另一个程序的输入。
例如:gcc -pipe -Wall foo.c -o foo
7、调试选项
-g或者-ggdb选项:在生成的可执行程序中包含标准调试信息。开发人员还可以通过在-g选项后附加数字1、2、3来指定在代码中加入调试信息的多少。默认级别为2(-g2)。
B、GDB
1、一般gdb主要提供以下功能:
①设置断点(断点可以是条件表达式),使程序在指定的代码行上暂停执行,便于观察。
②单步执行程序,便于调试
③查看程序中变量值的变化
④动态改变程序的执行环境
⑤分析崩溃程序产生的core文件
为了使gdb正常工作,必须使程序在编译时包含调试信息,这需要在gcc编译时加上-g或者-ggdb选项。
2、gdb常用命令
- gdb filename: 装入想要调试名为filename的可执行文件。
- run: 执行当先被调试的文件
- kill: 终止正在调试的程序
- step: 执行一行原代码并进入函数内部
- next: 执行一行源代码但不进入函数的内部
- break: 在代码里设置断点,使程序执行到这一行时挂起
- print: 打印表达式或变量的值,或打印内存中某个变量开始的一段连续的区域值,还可以对变量进行赋值
- display: 设置自动显示的表达式或变量,当程序停住或单步跟踪时,这些变量会自动显示其当前的值
- list: 列出产生执行文件的源代码的一部分
- quit: 退出gdb
- watch: 能监视一个变量的值不管它何时被改变
- backtrack: 回溯跟踪
- frame n: 定位到发生错误的代码段。n为backtrack命令的输出结果中的行号
- examine: 查看内存地址中的值
- jump: 使程序跳转执行
- signal: 产生信号量
- return: 强制函数返回(忽略还没有执行的语句)
- finish: 强制函数返回(直接执行完此函数,并返回该函数的返回值)
- call: 强制调用函数
- make: 使用户不退出gdb就可以重新产生可执行文件
- shell: 使用户不离开gdb就执行Linux的Shell命令。
3、设置断点:
break<function>: 在进入指定的函数时停止
break<linenum>: 在指定行停住
break +offset: 在当前行前面的offset行停住
break -offset: 在当前行后面的offset行停住
break <filename:linenum>: 在某个文件的某一行停住
break <filename:function>: 在某个文件的某个子函数停住
break *address: 在程序运行到内存地址处停住
break if<condition>: 在condition条件成立的时候停住。
4、显示代码
list<linenum>: 显示程序第linenum行周围的程序
list<function>: 显示函数名为function的函数的源程序
list: 显示当前行后面的程序
list-: 显示当前行前面的程序
set listsize <count>: 设置一次显示源代码的行数
show listsize: 查看当前listsize设置
list <first><last>: 显示从first到last行之间的源代码
list ,<last>: 显示从当前行到last行之间的源代码
info line <filename:linenum>或info line <filename:function>查看指定源代码运行时的内存地址
5、跳转执行:
jump <linespace>: linespace可以是文件行号,可以是file:line格式,可以是+num这种偏移量格式,表示下一条运行语句从哪开始。
jump<address>: 跳转到某一内存地址
注意:jump程序最好在同一函数中进行跳转,以免函数运行完成返回进行弹栈操作时发生错误。
6、使用gdb基本调试步骤
①装载目标文件②设置断点③run运行到断点处④step进入函数一步步查看⑤next执行一步程序但不进入函数⑥print查看或设置变量的值起⑦或者display函数自动的显示⑧或者examine查看内存地址中的值⑨set命令还可以设置gdb的环境变量⑩info可以查看寄存器情况。
四、make的使用和makefile的编写
A、make操作管理makefile的规则:
① 如果这个工程没有编译过,那么所有C文件都需要被编译链接。
②如果这个工程中的某几个C文件被修改,则只需编译被修改过的C文件,并链接目标程序。
③如果这个工程的头文件被改变了,则需要编译引用了这几个头文件的C文件,并链接目标程序。
make命令会自动智能地根据当前文件的修改情况来确定哪些文件需要重新编译。
make会自动在目录下寻找名为makefile的文件,或makefile文件夹下的文件,注意makefile文件里的命令必须要用“tab”开头,而不能用空格代替。
“\”为换行符,当某一条命令或规则不能在一行中写完时,可以用它表示换行。
目标名称指定惯例:all: 表示执行所有内容;clean:表示清除所有目标文件;distclean:表示清除所有内容;install:表示进行安装的内容
make工具的参数选项:(略)
B、makefile的书写规则
makefile的书写规则包含两部分,一是依赖关系,而是生成目标的方法。
makefile中规则的顺序很重要,第一个目标会成为最终目标。
1、makefile主要包含5方面内容:
①显示规则:说明如何生成一个或多个目标,由书写者显式指出要生成的文件,文件的依赖文件及生成的命令。
②隐式规则:makefile预先约定好的不用再写出来的规则。
③变量定义:makefile需要定义一系列变量,一般都是字符串,类似C语言的宏,当makefile执行时,其中的变量都会被扩展到相应的引用位置上。
④文件指示:包括三部分,第一部分是在一个makefile里引用另一个makefile,像C语言中的include一样包含进来;第二部分是根据某些境况指定makefile中有效的部分,就像C语言中的预编译宏#ifdef一样;第三部分就是定义一个多行的命令。
⑤注释:makefile只用行注释,和shell一样用“#”字符。
2、makefile基本语法规则:
targets: prerequistites
command
或者
targets :prerequistites ;command
command
target:是目标文件名,多个文件以空格分开,可以使用通配符。
prerequisites:是目标所依赖的文件或依赖的目标。
command:是命令行,如果不与target在一行,那就必须以Tab键开头,如果与target在一行,可以用分号分隔。
3、通配符
make支持三种通配符:*,?,[……],通配符代替了一系列的文件
“~”:波浪符代替了环境变量“HOME”所指的目录。
4、伪目标
伪目标不是一个文件,而是一个标签。make无法生成它的依赖关系和决定它是否执行,只有显示地指明“这个”目标才能让其生效。例如makefile中的clean。 “.PHONY”显示的指明一个目标为伪目标。
5、多目标:makefile中的目标可以不止一个,它支持多目标
6、自动生成依赖关系:“-MM”参数选项使其自动找寻源文件中包含的头文件,并生成一个依赖关系。
7、makefile的命令:如果想让上一条的命令结果应用在下一条命令,就不要将命令写在两行,直接用分号隔离这两条命令。
在makefile的命令行前加上“-”(在Tab键之后),则标记为该命令不管是否出错都认为是成功的。或者为make加上“-i”参数,那么makefile中所有的命令都会忽略错误。参数“-K”代表如果某个规则中的命令出错了,那就终止该规则的执行,但继续执行其他规则。@代表执行但不显示命令。“-n”代表只显示不执行命令。“-s”代表全面禁止命令的显示。
C、变量
makefile中变量可以使用在目标、依赖目标、命令或是makefile的其他部分中。
变量命名可以包含字符、数字、下划线,变量是大小写敏感的。
变量声明时需要给予初值,在使用时需在变量名前加上“$”符号,最好用()或{ }把变量给括起来。
“:=”操作符使得前面的变量不能使用后面的变量,只能使用前面已经定义好了的变量。
“?=”操作符如果变量已经被定义过则什么也不做,如果没有被定义过则按照现在规则定义。
“+=”操作符赋值时会继承前次操作。
define 变量名字 ,然后另起一行定义变量的值,以关键字endef结束。变量的值可以包含函数,命令,文字或是其他变量。
“override”指示符可通过make的命令行参数设置变量的值。格式如下:
override <variable>=<value>
目标变量:为某个目标设置的局部变量,可以与全局变量同名,因为它的作用范围只在这条规则及其连带的规则中,所以其值只在作用范围内有效。定义方法:
<target>:<variable-assignment>
或 <target>:override<variable-assignment>
例如:prog: CFLAGS=-g,不管CFLAGS在全局变量中是什么,在目标prog及其引发的所有规则中,CFLAGS的值就是-g.
D、常用函数的调用
makefile可以调用函数,语法如下:
$(<function><arguments>)或 ${<function><arguments>}
<function>是函数名,<arguments>是函数参数,参数之间用逗号隔开,而函数名和参数之间以空格分隔。函数调用以“$”开头,以圆括号或花括号把函数名和参数括起来。
1、字符串处理函数:(略)
2、循环函数:$(foreach <var>,<list>,<text>)
意思是把参数<list>中的单词逐一取出放到参数<var>所指定的变量中,然后再执行<text>所包含的表达式。每一次<text>会返回一个字符串,循环过程中<text>所返回的每一个字符串会以空格分隔,最后循环结束,所返回的每一个字符串所组成的整个字符串(以空格分隔)将会是foreach函数的返回值。
3、条件判断函数
ifeq(<argv1>,<argv2>) 比较参数1和参数2是否相等,若相等则表达式为真。
ifneq(<argv1>,<argv2>) 比较参数1和参数2是否相等,不相等则表达式为真。
ifdef <variable-name> 如果变量<variable-name>的值非空,则表达式为真。
ifndef <variable-name> 如果变量<variable-name>的值为空,则表达式为真。
if函数:
$(if <condition>,<then-part>) 或是 $(if <condition>,<then-part>,<else-part>)
如果条件为真,则 <then-part>是整个函数的的返回值,否则<else-part>是整个函数的返回值或者返回空字符串。
4、call函数,是唯一一个可以用来创建新的参数化的函数。
$(call <expression>,<\parm1>,<parm2>,<parm3>……)
当make执行这个函数时,<expression>参数中的变量,如$(1),$(2)等,会被参数<parm1> <parm2>依此取代。
5、origin函数,它不操作变量的值,只是告诉程序变量时从哪里来的。
$(origin <variable>)
6、shell函数
E、隐式规则
make的隐式规则库中,每条规则都有其顺序,越靠前的规则越被优先使用。
隐式规则中的变量分为两种,一种是命令相关,一种是参数相关。
命令相关变量及参数相关变量:(略)
可以使用模式规则来定义隐式规则。模式规则中目标的定义要有“%”字符。“%”定义对文件名的匹配,表示任意长度的非空字符串。在依赖目标中同样可以使用“%”,只是依赖目标中“%”的取值,取决于其目标。
自动化变量:就是这种变量会把模式中所定义的一系列的文件自动地逐个取出,直至所有的符合模式的文件都取完。这种自动化变量只应出现在规则的命令中。
makefile的自动化变量:
$@: 表示规则中的所有目标文件的集合。
$<: 依赖目标中的第一个目标名字。如果依赖目标是以模式(即%)定义的,则“$<”是符合模式的一系列文件。
$?: 所有比目标新的依赖目标的集合,以空格分隔。
$^: 所有依赖目标的集合,以空格分隔。如依赖目标有多个重复,则自动去除重复的依赖目标,只保留一份。
在模式匹配中,把“%”所匹配的内容叫做“茎”。当一个模式匹配包含有斜杠的文件时,那么在进行模式匹配时,目录部分会首先被移开,然后再进行匹配,成功后再把目录加回去。