diff --git "a/01 \347\216\213\351\233\252\345\275\261/20240613 \351\207\215\345\256\232\345\220\221\345\222\214\347\256\241\351\201\223.md" "b/01 \347\216\213\351\233\252\345\275\261/20240613 \351\207\215\345\256\232\345\220\221\345\222\214\347\256\241\351\201\223.md" new file mode 100644 index 0000000000000000000000000000000000000000..1cbb74f16d10f2db2fcebd07059b64129f956f66 --- /dev/null +++ "b/01 \347\216\213\351\233\252\345\275\261/20240613 \351\207\215\345\256\232\345\220\221\345\222\214\347\256\241\351\201\223.md" @@ -0,0 +1,153 @@ + + +## 一、重定向和管道 + +在 Unix 和 Linux 系统中,文件描述符用于表示打开的文件或者输入/输出流。常用的文件描述符包括: + +- `0`:标准输入(stdin): 键盘输入 +- `1`:标准输出(stdout): 直接显示在屏幕,不包含错误信息 +- `2`:标准错误(stderr): 只包含错误信息 + +使用形式: + +- 定向符前直接用数字,如 1> 1.txt 、 2> 2.txt +- 定向符后紧跟定向符并加&号如 >&1 +### 重定向 + +重定向允许将命令的输入或输出重定向到文件或其他命令。常用的重定向符号包括 `>`、`>>`、`<`、`2>` &>等。 +#### 输出重定向 + +1. **标准输出覆盖重定向 `>`** + + 将命令的标准输出重定向到一个文件,如果文件已经存在,则覆盖它。 +**追加输出重定向 `>>`** + +将命令的标准输出追加到一个文件的末尾,如果文件不存在,则创建它。 + +1. 注意: + + 1. **标准输出不含错误信息** + + +#### 输入重定向 + +1. **输入重定向 `<`** + + 将文件的内容作为命令的输入。 +错误重定向 +1. **错误输出重定向 `2>`** + + 将命令的错误输出重定向到一个文件。 + + ```bash + reboot 2> error_log.txt + ``` + + 这个命令会将 `ls` 命令的错误信息保存到 `error_log.txt` 文件中。 + +2. **错误输出追加重定向 `2>>`** + + 将命令的错误输出追加到一个文件。 +**同时重定向标准输出和标准错误输出** + +使用 `&>` 符号将标准输出和错误输出同时重定向到同一个文件。 + +```bash +command &> output_and_error_log.txt # 正确和错误原版混搭,原封不动 +command > 1.txt 2>&1 # 正确和错误原版混搭,原封不动 + +command > 1.txt 2>> 1.txt # 先正确后错误 +command 2> 1.txt >> 1.txt # 先错误后正确 + +``` + +这个命令会将 `command` 的标准输出和错误输出都保存到 `output_and_error_log.txt` 文件中。 +## 二、管道 `|` + +管道符号 `|` 将一个命令的输出作为另一个命令的输入。管道是进行命令链式操作的重要工具。 + +#### 使用场景 + +1. **将命令的输出传递给另一个命令** + + ```bash + ls -l | grep "txt" + ``` + + +2. **多命令链式操作** + + ```bash + ps aux | grep "sshd" | awk '{print $2}' + ``` + + 这个命令链会列出所有进程 (`ps aux`),然后过滤包含 "sshd" 的行 (`grep "sshd"`),最后提取进程 ID (`awk '{print $2}'`)。 +### 总结 + +- **重定向**: + - `>`:将输出重定向到文件(覆盖)。 + - `>>:将输出追加到文件。 + - `<`:将文件内容作为输入。 + - `2>`:将错误输出重定向到文件。 + - `2>>`:将错误输出追加到文件。 + - `&>`:将标准输出和错误输出同时重定向到文件。 + - `&>>`:将标准输出和错误输出同时追加重定向到文件。 + +- **管道 `|`**: + - 将一个命令的输出作为另一个命令的输入,用于链式操作。 + +## 三、tee命令 + +`tee` 是一个在Unix和类Unix操作系统上非常有用的命令行实用程序。它的作用是从标准输入中读取数据,并同时将数据输出到标准输出和一个或多个文件中。 + +下面是 `tee` 命令的基本语法: + +```bash +tee [OPTION]... [FILE]... +``` + +- `[OPTION]`: 一些选项,可以控制 `tee` 命令的行为。 +- `[FILE]`: 一个或多个文件名,表示要将数据写入的目标文件。 + +### 选项 + +- `-a`:追加写入文件而不是覆盖。 +- `-i`:忽略中断信号。 +- `--help`:显示帮助信息和选项列表。 +- `--version`:显示版本信息。 + +## 四、思考: + +- << 是什么功能?here document + +```apl +<< 是一种称为"here document"(这里文档)的特殊输入重定向方法。它允许在命令行中直接提供多行输入,而无需手动输入或从文件中读 +取。这在编写脚本或在命令行中执行需要大段输入的命令时非常有用。 + +<< 语法 +command << DELIMITER自定义结束分隔符(例END) +text +text +... +END + +command 是要接收输入的命令或程序。 +DELIMITER 是一个自定义的分隔符,可以是任何您选择的不包含空格或特殊字符的字符串,用于标记文档的开始和结束。 +text 是您要传递给命令或程序的文本内容,可以是多行的。 +``` +- ()把命令包括起来,是干什么功能? + +```apl +创建子shell、环境隔离、命令组合、用命令控制上下文 + +创建一个子shell,用于在一个独立的环境中执行一系列命令。 + +1. 基本语法和用法 + 在Shell脚本中,使用圆括号 () 来表示一组命令应该在一个子shell中执行。子shell中的命令可以是任何有效的Shell命令和语句,包括变量赋值、条件语句、循环等。 + +2. 子shell的特点 + 环境隔离: 子shell运行在独立的进程中,因此其环境变量、工作目录以及其他状态与父Shell是隔离的。 + 变量不共享: 在子shell中定义的变量和状态不会传递到父Shell中,它们只存在于子shell的生命周期中。 + 命令组合: 圆括号还可以用来组合多个命令,特别是在管道和命令替换的上下文中,这也是使用圆括号的另一种常见方式。 +``` +