Linux入门

 

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的含义是创建两个进程AB, 并将A进程的标准输出连接到B进程的标准输入. 这样, 将findgrep连接起来就能够筛选出当前目录(.)下所有以.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键可以提供联想.

viemacs这两款编辑器都需要一定的时间才能上手

进入了正确的目录后, 输入相应的命令就能够开始编辑文件. 例如输入

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程序就不会判断目标文件的新旧, 伪目标相应的命令序列总是会被执行.