# 认识命令行

> 命令行是 Linux 的精髓，它可以快速帮助你完成你想要操作系统执行的动作。

> 特别在服务器系统中，为了保持轻量化，并不会预装图形化界面，因此无论你是否要安装图形化界面，必须先通过命令行控制主机。

## 进入命令行

若没有安装桌面环境，或并未启用登录管理器，默认开机进入系统时，会进入 `tty` 窗口，即整个主机的终端，可以通过 `Ctrl` + `F1 ~ F6` 中任意一个按键来进入终端，`F1 ~ F6` 分别对应 `tty1` ~ `tty6` 6 个不同的会话，这些会话相互独立，可以运行多个不同的任务。

在预装了桌面环境的发行版中，查找终端字样的应用程序，打开即可进入终端，但这并非实际意义上的终端，仅仅是运行在桌面环境中的终端模拟器，通过模拟器可以操控命令行控制系统。

如果桌面出现故障，无法进行任何操作，也可以通过 `Ctrl` + `F1 ~ F6` 来进入 `tty` 终端，进行排错。

一般来说，使用 `tty` 需要先进行登录，输入用户名，回车后输入密码，即可进入 `tty`，但要注意的是，密码在输入过程中并不可见，这并不是键盘故障，而是出于安全考虑有意为之。

## Shell

用户在终端，输入的命令将会通过 `shell` 解释并传递给系统，同时 `shell` 也会分为不同的几种，常见的 `shell` 有 `bash` `zsh` `fish` `sh`，其中 `bash` 以出色语法兼容性被广泛内置于绝大多数的发行版中。

同样地，如果你安装了其他的 `shell`，可以直接使用他们的名称作为命令调用不同的 `shell`，这是暂时性的，若要更改当前用户的默认 `shell`，使用 `chsh -s` 命令进行更改，后接 `shell` 二进制文件的绝对路径，通常被存放于 `/bin` 路径下，如更改为 `bash` 如下：

```bash
chsh -s /bin/bash
```

## 工作目录

工作目录是当前命令行所在的目录位置，借助工作目录配合后续命令使用，工作效率将大幅提高。

登入终端的位置默认为用户的家目录，你可以通过 `pwd` 命令来查看自己当前所处的文件夹，结果将返回一个路径，为当前所在的路径。

```bash
pwd
```

一个示例输出如下，表示你当前处于 `/home/fovlin` 目录下。

```log
/home/fovlin
```

`cd` 命令可以更改当前的工作目录，传入的参数既可以是相对路径也可以是绝对路径，例如前往当前目录下的 `/home/fovlin/documents` 目录：

```bash
cd /home/fovlin/documents
```

## $PATH 变量

`$PATH` 是一个变量，包含着数个目录路径，每个路径之间使用 `:` 进行连接。

一个系统中的 `$PATH` 变量至少包含以下路径：

```log
/usr/local/sbin:/usr/local/bin:/usr/bin
```

当在命令行输入命令并回车时候，`shell` 会查询 `$PATH` 包含的每个路径下的二进制文件，顺序为从左到右，左侧优先级更高，如果查询到与输入命令的相同名称的可执行文件，将会直接调用该二进制文件，如果命令后有以空格为分隔其他字段，将会被作为参数传入二进制可执行文件。


## 运行可执行程序

直接键入命令将运行 `$PATH` 变量路径下的可执行文件。

而想要运行不在该变量中的可执行文件，可以使用绝对路径，或者相对路径。

使用绝对路径，例如一个可执行文件位于 `/usr/local/nginx/sbin/nginx` 路径，要运行 `nginx` 这个程序，在命令行输入该文件的绝对路径：

```bash
/usr/local/nginx/sbin/nginx
```

如当前目录下的 `code` 文件，如下：

```bash
./code
```

> 若提示权限拒绝，表示该文件并没有可执行权限，使用 `chmod 711 <filename>`，为文件添加可执行权限。

对于传入参数为路径的，当前工作目录下的文件可以直接填写文件名称以表示当前目录下的文件，例如以当前目录下的 `dir` 目录为传入参数：

```bash
cd dir
```

等效于 `cd ./dir`。

## 自动补全

手敲长命令是一种非常不友好的行为，shell 能在接受到 `Tab` 键信号后，自动预测该命令可能支持的下一个可填充字段，当有多个可填充字段出现，连续按两次 `Tab`，可列出所有可填充字段，当命令输入到一半，且后续没有其他可用字段与之匹配时候，使用 `Tab` 键补全是一个显著提高效率的操作。

## 管道

在命令行中，`|` 可以被加在执行命令后方，并后接其他命令，该符号被称为管道，管道前命令产生的输出会被管道输入到后方的命令，并进行执行。

一个简单的例子是查找一个目录下的一个文件，使用 `ls` 命令产生输出，并通过管道输入到后方的 `grep` 查找命令中，`grep` 命令将列出包含查找字符串的所有行。

例如查找包含 `file` 字符串的文件及其文件夹：

```bash
ls -lah | grep file
```

## man 手册

若你忘记了某些命令的语法格式，可以使用 `man <命令名>` 进行查询具体用法，或直接调用命令并附加参数 `--help`。

例如查询 `ls` 命令的用法：

```bash
man ls
```

或直接打印帮助列表

```bash
ls --help
```