Unverified Commit 06ebfc76 authored by Shuhao Zhang's avatar Shuhao Zhang Committed by GitHub
Browse files

Merge pull request #2615 from ayalhw/up-cmd

feat: some details about terminal
parents 73c61b13 cc35123f
Loading
Loading
Loading
Loading
+31 −5
Original line number Diff line number Diff line
@@ -4,7 +4,7 @@ author: StudyingFather, ayalhw

本页面将简要介绍命令行的一些使用方法。

## 一些常用命令
## 一些常用命令[^1]

### 文件系统相关

@@ -13,7 +13,7 @@ author: StudyingFather, ayalhw
- 相对路径:用相对当前路径的位置关系来描述位置。例如当前路径为 `~/folder` ,则 `./a.cpp` 实际上指的就是 `~/folder/a.cpp` 这个文件。 **随着当前路径的变化,相对路径描述的位置也可能发生改变**
-   绝对路径:用完整的路径来描述位置。例如 `~/folder/a.cpp` 就是一个绝对路径的例子。 **绝对路径描述的位置不随当前路径的变化而改变**

    Windows/Linux 用 `.` 代表当前目录, `..` 代表当前目录的父目录。特别地,在 Linux 下,用 `~` 表示用户主目录。
    Windows/Linux 用 `.` 代表当前目录, `..` 代表当前目录的父目录。特别地,在 Linux 下,用 `~` 表示用户主目录(注意 `~` 由 shell 展开,因此在其他地方可能不可用)

在 Windows/Linux 下,使用 `cd <目录>` 命令可以切换当前的目录。例如, `cd folder` 会切换到当前目录的 `folder` 子目录; `cd ..` 会切换到当前目录的父目录。

@@ -31,7 +31,10 @@ author: StudyingFather, ayalhw
command < input > output
```

例如, `./prog < 1.in > 1.out` 这个命令就将让 `prog` 这个程序从当前目录下的 `1.in` 中读入数据,并将程序输出写入到 `1.out`
例如, `./prog < 1.in > 1.out` 这个命令就将让 `prog` 这个程序从当前目录下的 `1.in` 中读入数据,并将程序输出覆盖写入到 `1.out`

???+ warning
     `1.out` 原本的内容会被覆盖,如果想要在原输出文件末尾追加写入,请使用 `>>` ,即 `./prog >> 1.out` 的方式做输出重定向

事实上,大多数 OJ 都采用了这样的重定向机制。选手提交的程序采用标准输入输出,通过重定向机制,就可以让选手的程序从给定的输入文件读入数据,输出到指定的输出文件,再进行文件比较就可以评测了。

@@ -77,6 +80,10 @@ command < input > output
-  `-O1``-O2``-O3` :对编译的程序进行优化,数字越大表示采用的优化手段越多(开启优化会影响使用 gdb 调试)。
-  `-DDEBUG` :在编译时定义 `DEBUG` 符号(符号可以随意更换,例如 `-DONLINE_JUDGE` 定义了 `ONLINE_JUDGE` 符号)。
-  `-UDEBUG` :在编译时取消定义 `DEBUG` 符号。
-  `-lm``-lgmp` : 链接某个库(此处是 math 和 gmp,具体使用的名字需查阅库文档,但一般与库名相同)。

???+ note
    在 Linux 下,如使用了标准 C 库里的 math 库( `math.h` ),则需在编译时添加 `-lm` 参数。[^have-to-link-libm-in-gcc]

### 命令行调试

@@ -92,9 +99,28 @@ command < input > output
-  `continue``c` ):在程序遇到断点后继续执行,直到程序结束运行或到达下一个断点。
-  `next``n` ):执行当前行语句,如果当前行有函数调用,则将其视为一个整体执行。
-  `step``s` ):执行当前行语句,如果当前行有函数调用,则进入该函数内部。
-  `display``disp` ):指定程序暂停时显示的表达式。
-  `finish``fin` ):继续执行至当前函数返回。
-  `call` :调用某个函数,例如: `call f(2)` (以参数 2 调用函数 f)。
-  `quit``q` ):退出 gdb。
-  `display``disp` ):指定程序暂停时显示的表达式。
-    `print``p` ):打印表达式的值。

     `display` 和 `print` 指令都支持控制输出格式,其方法是在命令后紧跟 `/` 与格式字符,例如 `p/d test` (按照十进制打印变量 test 的值),
    支持的格式字符有:

| 格式字符 | 对应格式          |
| ---- | ------------- |
| d    | 按十进制格式显示变量    |
| x    | 按十六进制格式显示变量   |
| a    | 按十六进制格式显示变量   |
| t    | 按二进制格式显示变量    |
| c    | 按字符格式显示变量     |
| f    | 按浮点数格式显示变量    |
| u    | 按十进制格式显示无符号整型 |
| o    | 按八进制格式显示变量    |

## 参考资料与注释

- 刘汝佳《算法竞赛入门经典(第 2 版)》附录 A 开发环境与方法
[^1]: 刘汝佳《算法竞赛入门经典(第 2 版)》附录 A 开发环境与方法

[^have-to-link-libm-in-gcc]:  [Why do you have to link the math library in C?](https://stackoverflow.com/questions/1033898/why-do-you-have-to-link-the-math-library-in-c)