Linux终端入门手册
shell 提示符
username@hostname:direction$
shell命令格式
command [option] [arguments]
按一次tab补全文件名
按两次tab补全命令
单击右键粘贴
基本命令
帮助命令
- man 查看man手册
- info 查看info手册
- —help
目录
- 根目录 /
- .代表目录自己 ..代表目录的父目录,对于根目录.和..都代表自己
- pwd 查询当前目录路径
- ~ 引用当前用户的主目录
- 绝对路径
/home/hxy/hello.txt
- 相对路径
./hello.txt
文件与目录相关命令
ls 显示目录内容
ls -la 列出所有文件,包括隐含文件
ls -dl 仅查看目录属性
ls -R 递归显示子目录的文件
ls 文件名/文件夹名 查看文件信息
ls -l 详细结果
详细结果:
drwx------ 14 student student 409611...
第一个字符表示文件类型:-普通文件 d目录 l符号链接 b块设备文件 c字符设备文件
后面9个字符表示文件的访问权限:- 第一组表示文件属主的权限
- 第二组表示同组用户的权限
- 第三组表示其他用户的权限
各权限如下 - r 读
- w 写
- x 执行,对于目录表示进入
cd 切换工作目录
- cd .. 进入上一级目录
- cd ~ 或 cd 进入用户主目录
mv [options] 源文件/文件夹 目标文件/文件夹
cp 复制文件或目录
- cp -a 拷贝目录,保留一切链接和属性
- cp -f 覆盖已经存在的目标文件而不提示
- cp -R 递归复制目录下的所有字目录和文件
mkdir 创建一个目录
- mkdir -m 对新建目录设置存取权限(chmod)
- mkdir -p 自动补全不存在的上级目录
rmdir 删除空目录
- rmdir -p 递归删除目录
rm 删除
- rm -r 递归删除(等同rmdir)
- rm -i 删除一个文件
- rm -f 不询问,直接删除
file 确定文件类型
cat 链接或显示文件内容
- 带行数 cat -n 等价于nl
tac 从最后一行开始显示文件内容
more/less
head/tail
touch 新建文件
nl 按输出行号的方式显示文件
ln 为一个文件在另一个位置建立符号链接
ln -s 目标 目录
软连接,一个指向源文件名的连接文件,类似快捷方式ln 目标 目录
硬连接 类似指针
字符
- grep 定位字符信息
- wc 统计字符信息
- sort 排序字符信息
打包/压缩文件
- 打包:把所有文件合并在一个tar文件里
- 压缩 使用gzip(tar.gz/tgz)或biz2(tar.bz2)压缩
.gz比较快,压缩率不如bz2 - -c 创建tar文件 -f将文件打包生成到一个文件
tar -cf new.tar ./home/se
tar -xf new.tar
解包- 对于zip格式:tar cvzf 打包 tar xvzf解包
- 对于biz2格式: tar cvjf 打包 tar xvjf解包
用户管理及网络设置
GCC编译器
gcc支持的源码格式:.c .cpp .m(Objective-C源程序) .i(预处理后的c文件) .ii(预处理后的c++文件) .s/.S(汇编语言源程序) .h(预处理器文件) .o(目标文件)
gcc的基本使用
单个源码
gcc hello.c -o hello
把hello.c编译成一个可执行程序hello(一次性完成四步)gcc hello.c
不指定输出名,生成一个a.out源文件到可执行文件的编译过程:
预处理
gcc -E hello.c -o hello.i
编译:将源代码编译成汇编代码
gcc -S hello.i -o hello.s
汇编:将汇编代码汇编成目标文件
gcc -c hello.s -o hello.o
链接:将目标代码和所需要库链成一个完整的应用程序
gcc hello.o -o hello
gcc的结果输出于后缀名,只和输出参数有关
多个源码
- 一般先将源代码编译成目标代码,最后一次链接成可执行程序
- 对于有头文件在多个目录,需要在编译时多次使用-I参数加入头文件所在目录
例如a.c需要用到/usr,当前目录/homegcc -I -I/usr -I/home -c a.c
- 对于多个源文件组成的程序。可以把多个文件在一句里编译,但建议不这样做,建议使用makefile脚本来调用gcc构造,见下一节
gcc a.c b.c d.c -o test
gcc的选项
- 宏macro
- -Dmacro
gcc test.c -DPRINTF=printf -o test
- -Dmacro=defn
gcc test.c -DNUM=10 -o test
- -Dmacro
gcc -Wall a.c -o a
打开所有编译警告gcc -Wall -Werror a.c -o a
将警告视作错误,出现任何警告就放弃编译gcc -w
禁止输出警告
gcc使用的第三方库
gcc命令的参数详解
-x:设定文件名所使用的语言,使文件后缀名无效
gcc -x c hello.pig
-c:只进行预处理,编译和汇编,即生成.o的obj文件
gcc -c hello.c
-S:只进行预处理和编译,即把文件编译为.s汇编代码
gcc -S hello.c
-E:只激活预处理。这个命令不会不生成文件, 我们需要把它重定向到一个输出文件里面
gcc -E hello.c > pianoapan.txt
-o:生成可执行文件
gcc -o hello hello.c
-fno-asm
-fno-strict-prototype
-fthis-is-varialble
-fcond-mismatch
-funsigned-char 、-fno-signed-char、-fsigned-char 、-fno-unsigned-char
-include file
-imacros file
b
Makefile
make的调用
直接执行make,自动查找当前目录下名为makefile的文件,并自动从第一个target开始执行
如果makefile脚本名称不是缺省名称,使用-f参数来表示
make -f hello.mk
如果需要make查找其他目录下的makefile,使用-C参数
make -C /home
在makefile中以target表示不同的编译部分,可以在命令行直接写target名称,用于一个活多个target的编译
make install
make target1 target2
makefile的格式
makefile由由一组依赖关系和规则构成
每个依赖关系由一个目标(即将要创建的文件)和它依赖的源文件组成
规则描述了怎样从源文件创建出目标文件
规则也称为target
规则
目标名称:[依赖对象]<tab>命令列表
目标名称是需要创建的结果的名称
依赖对象表示创建这个目标之前必须预先创建的其他目标,可以是另一个规则的名称,也可以是基本文件的名称
命令列表表示为了创建这个目标,需要执行那些shell命令可以是一行或多行shell命令,每一行命令行的行首必须是一个tab
行首必须是tab不能是空格,否则makefile出错
如果命令行过长,可用\分行,新行无需tab打头
1
2
3
4
5
6
# 要想生成hello.o目标,必须先有hello.c,然后调用gcc编译生成hello.o,依赖对象hello.c可以省略
hello.o: hello.c
gcc -c hello.c -o hello.o
# 要想生成执行程序hello,必须先执行规则hello.o,然后调用命令行gcc连接生成hello
hello: hello.o
gcc hello.o -o hellomakefile里规则的前后顺序不太重要,实际调用顺序取决目标之间的依赖关系,因此make采用逆推的方式来判断和执行目标
伪目标phony target:一般的目标最终是为了生成一个文件,但有一些目标可以不生成结果文件,只是为了调用命令或依赖对象,具体动作需要需要开发者自行编写
- all 编译所有目标
- clean 清楚项目生成的中间文件和最终生成文件
- install 项目如何安装
- uninstall 项目如何卸载
makefile基本结构
makefile一般包含:
需要由make工具创建的项目,通常是目标文件和可执行文件,它们一般被称为target
要创建的目标依赖于哪些文件
创建每个目标时需要运行的的命令,命令之间用tab打头
通常包含的固定伪目标
#表示注释行
1
2
3
4
5
6
7
8
9
10
11#Makefile for exp2
main: main.o add.o del.o modify.o
gcc -o main main.o add.o del.o modify.o
main.o: main.c
gcc -c main.c
add.o: add.c
gcc -c add.c
del.o: del.c
gcc -c del.c
modify.o: modify.c
gcc -c modify.c
makefile扩展用法
变量(宏):利用简单的变量定义冗长的编译选项,引用时需要添加$符号
1
2
3
4
5
6
7# Define macros for name of compiler
CC = gcc
# Define a macro for the CC flags
CCFLAGS = -D_DEBUG -g -m486
# A rule for building a object file
test.o: test.c test.h
$(CC) -c $(CCFLAGS) test.cmakefile变量定义,=两边一定要有空格
makefile的变量定义要独立在规则之外,一般在最前
GNU make的预定义变量
$< 第一个依赖文件的名称
$@ 目标的完整名称
$^ 所有的依赖文件,以空格分开,不包含重复的
AR 归档维护程序的名称,默认值ar ARFLAGS 归档维护程序的选项
AS 汇编程序的名称,默认值as ASGLAGS 汇编程序的选项
CC c编译器的名称,默认值cc CCFLAGS c编译器的选项
1
2
3
4
5
6
7
8
9
10
11#makefile2 for exp
main: main.o add.o del.o modify.o
gcc -o $@ $^
main.o: main.c
gcc -c $<
add.o: add.c
gcc -c $<
del.o: del.c
gcc -c $<
modify.o: modify.c
gcc -c $<
自动化变量使用
1
2
3
4
5#makefile2 for exp
main: main.o add.o del.o modify.o
gcc -o $@ $^
.c.0:
gcc -c $<
隐含规则
GNU make的一些内置的隐含规则定义了如何从不同依赖文件建立特定类型的目标文件
后缀规则suffix rule
将一个具有某个后缀的文件转换为具有另一后缀的文件1
2.c.0:
$(CC) $(CCFLAGS) -c -o $@ $<模式规则pattern rules
在目标的前面多一个%,同时可用来定义目标和依赖文件之间的关系1
2%.o:%.c:
$(CC) $(CCFLAGS) -c -o $@ $<
makefile目标编译
如果不指定目标,make会默认第一个target
规范的makefile文件有以下常见的几个目标:
make all 编译所有目标
make clean 在编译结束后删除.o文件
make install 编译结束后将最终的可执行文件安装到系统的某一个位置
1
2
3
4
5
6
7
8
9
10#makefile for example
example: example.o add.o modify.o delete.o
$(CC) -o $@ $^
.c.o:
$(CC) -c $<
all: example
clean: all
rm -f *.o
install: clean
cp example /usr/local/bin
GDB调试器和调试方法
gdb的使用
为使程序能被调试,需要gcc编译时用-g选项为程序编译时添加调试信息gcc -g -o helloworld helloworld.c
然后在命令行键入gdb并回车就可以运行了
gdb命令
file 装入想要调试的可执行文件。
kill 终止正在调试的程序。
list 列出产生执行文件的源代码的一部分。
next 执行一行源代码但不进入函数内部。
step 执行一行源代码而且进入函数内部。
run 执行当前被调试的程序。
c 继续运行程序。
quit 终止gdb。
watch 使你能监视一个变量的值而不管它何时被改变。
backtrace 栈跟踪,查出代码被谁调用。
print 查看变量的值。
make 使你能不退出gdb就可以重新产生可执行文件。
shell 使你能不离开gdb就执行UNIX shell命令。
whatis 显示变量或函数类型。
break 在代码里设断点,这将使程序执行到这里时被挂起。
- break linenum 根据行号设置断点
- break funcname 根据函数名设置断电
- break filename:linenum/funcname 执行非当前源文件的某行或某函数的时候停止执行
- break linenum/funcname if expr 根据条件停止程序执行
info break 显示当前断点清单,包括到达断点处的次数等。
info files 显示被调试文件的详细信息。
info func 显示所有的函数名称。
info local 显示当函数中的局部变量信息。
info prog 显示被调试程序的执行状态。
delete [n] 删除第n个断点。
disable[n] 关闭第n个断点。
enable[n] 开启第n个断点。
ptype 显示结构定义。
set variable 设置变量的值。
call name(args) 调用并执行名为name,参数为args的函数。
Finish 终止当前函数并输出返回值。
return value 停止当前函数并返回value给调用者。