Linux入门
原文来自南京大学计算机系统课程网站,本文为重要知识点简记
命令行
命令名称 参数1 参数2 参数3 ...
ls
用于列出当前目录(即”文件夹”)下的所有文件(或目录). 目录会用蓝色显示.ls -l
可以显示详细信息.pwd
能够列出当前所在的目录.cd DIR
可以切换到DIR
目录. 在Linux中, 每个目录中都至少包含两个目录:.
指向该目录自身,..
指向它的上级目录. 文件系统的根是/
.touch NEWFILE
可以创建一个内容为空的新文件NEWFILE
, 若NEWFILE
已存在, 其内容不会丢失.cp SOURCE DEST
可以将SOURCE
文件复制为DEST
文件; 如果DEST
是一个目录, 则将SOURCE
文件复制到该目录下.mv SOURCE DEST
可以将SOURCE
文件重命名为DEST
文件; 如果DEST
是一个目录, 则将SOURCE
文件移动到该目录下.mkdir DIR
能够创建一个DIR
目录.rm FILE
能够删除FILE
文件; 如果使用-r
选项则可以递归删除一个目录. 删除后的文件无法恢复, 使用时请谨慎!man
可以查看命令的帮助. 例如man ls
可以查看ls
命令的使用方法. 灵活应用man
和互联网搜索, 可以快速学习新的命令.
统计代码行数
统计一个目录中(包含子目录)中的代码行数. 如果想知道当前目录下究竟有多少行的代码, 就可以在命令行中键入如下命令:
find . | grep '\.c$\|\.h$' | xargs wc -l
find .
实际能够列出当前目录下的所有文件
grep
命令能够提取所有.c
和.h
结尾的文件
连接起这两个命令的关键就是管道符号|
. 这一符号的左右都是Shell命令, A | B
的含义是创建两个进程A
和B
, 并将A
进程的标准输出连接到B
进程的标准输入. 这样, 将find
和grep
连接起来就能够筛选出当前目录(.
)下所有以.c
或.h
结尾的文件.
wc
命令的-l
选项能够计算代码的行数. xargs
命令十分特殊, 它能够将标准输入转换为参数, 传送给第一个参数所指定的程序. 所以, 代码中的xargs wc -l
就等价于执行wc -l aaa.c bbb.c include/ccc.h ...
, 最终完成代码行数统计.
统计磁盘使用情况
du -sc /usr/share/* | sort -nr
du
是磁盘空间分析工具, du -sc
将目录的大小顺次输出到标准输出, 继而通过管道传送给sort
. sort
是数据排序工具, 其中的选项-n
表示按照数值进行排序, 而-r
则表示从大到小输出. sort
可以将这些参数连写在一起.
du -sc /usr/share/* | sort -nr | more
/usr/share
中的目录过多, 无法在一个屏幕内显示,more
工具使用空格翻页, 并可以用q
键在中途退出.
注意在输入目录名时, tab
键可以提供联想.
vi
和emacs
这两款编辑器都需要一定的时间才能上手
进入了正确的目录后, 输入相应的命令就能够开始编辑文件. 例如输入
vi hello.c
或emacs hello.c
终端中可以用cat hello.c
查看代码的内容. 如果要将它编译, 可以使用gcc
命令:
gcc hello.c -o hello
gcc
的-o
选项指定了输出文件的名称, 如果将-o hello
改为-o hi
, 将会生成名为hi
的可执行文件. 如果不使用-o
选项, 则会默认生成名为a.out
的文件, 它的含义是assembler output. 在命令行输入
./hello
./hello则表示当前目录下的hello文件
使用重定向
将程序的输出信息保存到文件中, 方便以后查看. 例如你编译了一个程序myprog, 你可以使用以下命令对myprog进行反汇编, 并将反汇编的结果保存到output文件中:
objdump -d myprog > output
‘>’是标准输出重定向符号, 可以将前一命令的输出重定向到文件output中. 这样, 你就可以使用文本编辑工具查看output了.
time ./myprog < data | tee output
这个命令在运行myprog
的同时, 指定其从文件data
中读入数据, 并将其输出信息打印到屏幕和文件output
中. time
工具记录了这一过程所消耗的时间,如果你希望输出到文件的同时也输出到屏幕上, 你可以使用tee命令
使用Makefile管理工程
在hello.c
所在目录下新建一个文件Makefile
, 输入以下内容并保存:
hello:hello.c
gcc hello.c -o hello # 注意开头的tab, 而不是空格
.PHONY: clean
clean:
rm hello # 注意开头的tab, 而不是空格
返回命令行, 键入make
, 你会发现make
程序调用了gcc
进行编译. Makefile
文件由若干规则组成, 规则的格式一般如下:
目标文件名:依赖文件列表
用于生成目标文件的命令序列 # 注意开头的tab, 而不是空格
我们来解释一下上文中的hello
规则. 这条规则告诉make
程序, 需要生成的目标文件是hello
, 它依赖于文件hello.c
, 通过执行命令gcc hello.c -o hello
来生成hello
文件.
clean
并不是用来生成一个名为clean
的文件, 而是用于清除编译结果, 并且它不依赖于其它任何文件. 如果很不幸地, 目录下已经存在了一个名为clean
的文件, 执行make clean
会得到”文件已经是最新版本”的提示. 解决这个问题的方法是在Makefile
中加入一行PHONY: clean
, 用于指示”clean
是一个伪目标”. 这样以后, make
程序就不会判断目标文件的新旧, 伪目标相应的命令序列总是会被执行.