From f7cbeda636639c882417a0f4208d7f11222ec718 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=94=90=E5=9B=BD=E4=BA=AE?= <647597435@qq.com> Date: Fri, 14 Jun 2024 04:48:17 +0000 Subject: [PATCH] =?UTF-8?q?=E5=94=90=E5=9B=BD=E4=BA=AE?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: 唐国亮 <647597435@qq.com> --- ...21\345\222\214\347\256\241\351\201\223.md" | 294 ++++++++++++++++++ 1 file changed, 294 insertions(+) create mode 100644 "\345\224\220\345\233\275\344\272\256/20240614\351\207\215\345\256\232\345\220\221\345\222\214\347\256\241\351\201\223.md" diff --git "a/\345\224\220\345\233\275\344\272\256/20240614\351\207\215\345\256\232\345\220\221\345\222\214\347\256\241\351\201\223.md" "b/\345\224\220\345\233\275\344\272\256/20240614\351\207\215\345\256\232\345\220\221\345\222\214\347\256\241\351\201\223.md" new file mode 100644 index 0000000..b1b1a70 --- /dev/null +++ "b/\345\224\220\345\233\275\344\272\256/20240614\351\207\215\345\256\232\345\220\221\345\222\214\347\256\241\351\201\223.md" @@ -0,0 +1,294 @@ +# 重定向和管道 + + + +## 重定向 + +在 Unix 和 Linux 系统中,文件描述符用于表示打开的文件或者输入/输出流。常用的文件描述符包括: + +- `0`:标准输入(stdin): 键盘输入 +- `1`:标准输出(stdout): 直接显示在屏幕,不包含错误信息 +- `2`:标准错误(stderr): 只包含错误信息 + +#### 使用形式: + +- 定向符前直接用数字,如 1> 1.txt 、 2> 2.txt +- 定向符后紧跟定向符并加&号如 >&1 + +### 重定向 + +重定向允许将命令的输入或输出重定向到文件或其他命令。常用的重定向符号包括 **`>`、`>>`、`<`、`2>` &>等。** + +#### **>** 和 **>>** 都是只接受标准输出 + +#### 输出重定向 + +1. **标准输出覆盖重定向 `>`** + + 将命令的标准输出重定向到一个文件,如果文件已经存在,则覆盖它。没有则创建。 + +2. **追加输出重定向 `>>`** + + 将命令的标准输出追加到一个文件的末尾,如果文件不存在,则创建它。 + + +3. **注意:** + + **标准输出不含错误信息** + +#### 输入重定向 + +1. **输入重定向 `<`** + + 将文件的内容作为命令的输入。 + +~~~ shell + sort < unsorted_list.txt + + # 原文件 + apple + orange + banana + + # 这个命令将 `unsorted_list.txt` 文件的内容作为 `sort` 命令的输入进行排序。 +~~~ + + + + + +### SQL脚本文件读取命令并在数据库中执行。 + +~~~ shell + # 示例: + mysql -u root -p mydatabase < script.sql + #该命令将 script.sql 文件中的SQL命令导入到 mydatabase 数据库中。 + # 还原数据库常用的命令 +~~~ + + + +#### 错误重定向(输出后含有标准错误) + +```shell + 参考:find / -name '*.conf' +``` + + + +1. **错误输出重定向 `2>`** + + 将命令的错误输出重定向到一个文件。 + + ```bash + reboot 2> error_log.txt + +2. **错误输出追加重定向 `2>>`** + + 将命令的错误输出追加到一个文件。 + + ```bash + ls non_existent_file 2>> error_log.txt + ``` + + 这个命令会将 `ls` 命令的错误信息追加到 `error_log.txt` 文件中。 + + + +3. **同时重定向标准输出和标准错误输出** + + &>符号,原封不动放进去 + + 使用 `&>` 符号将标准输出和错误输出同时重定向到同一个文件。 + + ```bash + command &> output_and_error_log.txt # 正确和错误原版混搭,原封不动 + command > 1.txt 2>&1 # 正确和错误原版混搭,原封不动 + + command > 1.txt 2>> 1.txt # 先正确后错误 + command 2> 1.txt >> 1.txt # 先错误后正确 + + + +## 管道 `|` + +管道符号 `|` 将一个命令的输出作为另一个命令的输入。管道是进行命令链式操作的重要工具。 + +### 示例解析 + +#### 使用管道和重定向的综合示例 + +1. **查找特定文件并将结果保存到文件** + + ```bash + find / -name "*.conf" 2> errors.txt | sort > sorted_log_files.txt + + + ``` + + 这个命令会在根目录下查找所有以 `.log` 结尾的文件,将错误信息重定向到 `errors.txt`,并将结果进行排序后保存到 `sorted_log_files.txt`。 + +### 总结 + +- **重定向**: + - `>`:将输出重定向到文件(覆盖)。 + - `>>:将输出追加到文件。 + - `<`:将文件内容作为输入。 + - `2>`:将错误输出重定向到文件。 + - `2>>`:将错误输出追加到文件。 + - `&>`:将标准输出和错误输出同时重定向到文件。 + - `&>>`:将标准输出和错误输出同时追加重定向到文件。 + +**扩展:** + +- 输入输出一起使用的情况 + + ```basn + sort < a.txt > b.txt + 排序a后覆盖到b,a不变 + ``` + +## 重定向配合管道符 + +### /dec/null 空设备,相当于垃圾桶 + + + +- **重定向标准输出和错误输出到不同文件:** + + - 若要将标准输出重定向到一个文件,将错误输出重定向到另一个文件,可以使用以下命令: + + ```sh + command > output.txt 2> error.txt + ``` + + 这样,标准输出会被写入 `output.txt`文件,而错误输出则会被写入`error.txt` + + 文件。 + +- **将错误输出追加到标准输出文件中:** + + - 若要将错误输出追加到标准输出文件中,可以使用以下命令: + + ```bash + command > output.txt 2>&1 + # 等效谁? + 等效于 + command &> output.txt + command >& output.txt + ``` + + 这会将标准输出写入`output.txt`文件,同时将错误输出追加到标准输出文件中。 + +- **将错误输出丢弃:** + + - 若要忽略错误输出,可以将错误输出重定向到特殊设备 `/dev/null + ` + + ,例如: + + ```bash + command 2> /dev/null + ``` + 这会将错误输出发送到 `/dev/null + `,从而丢弃错误输出而只保留标准输出 + + + + + +### `tee` 命令 + +`tee` 是一个在Unix和类Unix操作系统上非常有用的命令行实用程序。它的作用是从**标准输入中读取数据,并同时将数据输出到标准输出和一个或多个文件中。** + +**追加过去,然后还会标准输出在屏幕**,同时支持多个文件 + +```bash +tee [OPTION]... [FILE]... +支持使用{1..6}.txt +``` +- `[OPTION]`: 一些选项,可以控制 `tee` 命令的行为。 +- `[FILE]`: 一个或多个文件名,表示要将数据写入的目标文件。 + +### 示例 1:简单的使用方式 +```bash +echo "Hello, world" | tee output.txt +``` +在这个示例中,`echo "Hello, world"` 命令的输出被送到 `tee` 命令,然后 `tee` 将这个输出写入到 `output.txt` 文件,并同时将其输出到标准输出。 + +### 示例 2:同时写入多个文件 +```bash +echo "Hello, world" | tee file1.txt file2.txt +``` +在这个示例中,`tee` 命令将 `Hello, world` 写入到 `file1.txt` 和 `file2.txt` 文件中,并同时将其输出到标准输出。 + +### 示例 3:追加写入文件 +```bash +echo "New data" | tee -a file1.txt +``` +通过 `-a` 选项,`tee` 命令将数据追加写入到 `file1.txt` 文件中,而不是覆盖原有内容。 + +### 示例 4:结合重定向和管道 +```bash +command1 | tee >(command2) | command3 +只运行最后一个 +``` +在这个示例中,`command1` 的输出被送到 `tee` 命令,然后 `tee` 将输出传递给 `command2`,并且同时将输出发送到 `command3`。这种结构可以用于复杂的管道命令中。 + +### 选项 +- `-a`:追加写入文件而不是覆盖。 +- `-i`:忽略中断信号。 +- `--help`:显示帮助信息和选项列表。 +- `--version`:显示版本信息。 + + + +# 作业 + +## 思考: + +```shell +<< 是什么功能?here document + +#<< 是一种称为"here document"(这里文档)的特殊输入重定向方法。它允许您在命令行中直接提供多行输入,而无需手动输入或从文件中读取。这在编写脚本或在命令行中执行需要大段输入的命令时非常有用。 + + +# << 语法 +command << DELIMITER自定义结束分隔符(例END) +text +text +... +END + +command 是要接收输入的命令或程序。 +DELIMITER 是一个自定义的分隔符,可以是任何您选择的不包含空格或特殊字符的字符串,用于标记文档的开始和结束。 +text 是您要传递给命令或程序的文本内容,可以是多行的。 + +# 例子 +# 读取并处理输入 +su@hecs-169541:~$ cat << end +> 1.txt +> output.txt +> end +1.txt +output.txt + + +``` + +```shell + +()把命令包括起来,是干什么功能? +创建子shell、环境隔离、命令组合、用命令控制上下文 + +# 创建一个子shell,用于在一个独立的环境中执行一系列命令。 + + +#1. 基本语法和用法 +在Shell脚本中,使用圆括号 () 来表示一组命令应该在一个子shell中执行。子shell中的命令可以是任何有效的Shell命令和语句,包括变量赋值、条件语句、循环等。 + +#2. 子shell的特点 +环境隔离: 子shell运行在独立的进程中,因此其环境变量、工作目录以及其他状态与父Shell是隔离的。 +变量不共享: 在子shell中定义的变量和状态不会传递到父Shell中,它们只存在于子shell的生命周期中。 +命令组合: 圆括号还可以用来组合多个命令,特别是在管道和命令替换的上下文中,这也是使用圆括号的另一种常见方式。 +``` \ No newline at end of file -- Gitee