# 输入/输出重定向

## 输出重定向

在终端中，可以使用 `>` 或 `>>` 将输出重定向到文件中，其中 `>` 表示覆盖文件，`>>` 表示添加到文件的尾行。

```txt
command > file
```

例如，`echo` 命令将输出指定的变量或字符串，可以通过输出重定向快速写入内容到文件，例如想在 `.bashrc` 的尾行加入一条内容 `alias ll='ls -lh --color=auto'`：

```bash
echo "alias ll='ls -lh --color=auto'" >> .bashrc
```

这将在尾行追加该内容，你也可以使用 `>` 覆盖整个文件。

## 输入重定向

可以将文件内容使用 `<` 输入给命令：

```txt
command < file
```

`wc -m` 命令可以统计字数，通过输入重定向，即可统计文件字数，例如统计 `README.md` 文件字符数：

```bash
wc -m < README.md
```

内容将以字符串传递给前方命令，即使该命令和 `wc -m README.md` 效果一样，但前者通过倾向于统计字符串个数，后者倾向于读取文件内字符串个数。

## 过滤文件描述符的输出重定向

文件描述符是操作系统中用于标识打开的文件的一个整数。

在 Unix 和 Linux 系统中，每个进程在启动时会自动打开三个标准的文件描述符：

- `0`：标准输入（stdin）

- `1`：标准输出（stdout）

- `2`：标准错误（stderr）

使用 `n>` 的方式来过滤输出，其中 `n` 为指定的文件描述符。

例如要将错误信息输出到文件 `error.log` 中，可以使用如下格式的命令

```txt
command 2> error.log
```

同样的，你可以用 `n>>` 的方式将输出追加到文件尾行。

## Here Document

使用 `<<` 可以交互式将输入内容输入到 Shell 程序中，例如在终端中输入以下命令，回车后将允许你继续输入内容，直到你再此输入 `maker`，`maker`是一个标记，你可以将他替换为任意字符串。

```txt
$ wc -m << maker
> Acovia docs
> maker
12
$ 
```

## 组合重定向

如果你希望将多个文件描述符的内容写入文件，可以组合写入，格式如下：

```txt
command > out.log 2>&1
```

`&` 将合并这两个输入符的输出。