Linux下重定向详解
### Linux下重定向详解 #### 一、基本概念 在深入了解Linux下的I/O重定向之前,首先需要掌握一些基础的概念。 - **I/O重定向**:通常与文件描述符(File Descriptor, FD)有关,shell中通常包含10个文件描述符,编号为0至9。 - **常用文件描述符**: - 0 (stdin, 标准输入):默认与键盘关联,用于接收用户的输入。 - 1 (stdout, 标准输出):默认与显示器关联,用于显示程序正常输出的信息。 - 2 (stderr, 标准错误输出):同样默认与显示器关联,用于显示程序异常或错误信息。 - **文件描述符的更改**: - `<`:用于改变读取的数据源(stdin),使之从指定的文件读取。 - `>`:用于改变输出的数据目的地(stdout, stderr),使之输出到指定的文件。 - 默认值:`<` 的默认文件描述符为0,`>` 的默认文件描述符为1。 - **处理顺序**:在I/O重定向中,标准输出和标准错误输出的管道会优先准备,然后再从标准输入读取数据。 - **管道** (`|`):允许上一个命令的标准输出作为下一个命令的标准输入。 - **tee命令**:可以在不影响原本I/O流的情况下,将标准输出复制一份到文件中。 - **bash命令执行流程**:包括分析命令、变量求值、命令替换(`` 和 `$()`)、重定向、通配符展开、确定路径以及最终执行命令。 - **子shell** (`()`):将命令组置于子shell环境中执行,继承父shell的输入/输出/错误描述符以及其他打开的文件描述符。 - **exec命令**:用于替代当前shell并重新启动一个新的shell,不创建子shell,且会清除现有的环境设置。在对文件描述符进行操作时,exec不会覆盖当前shell环境。 #### 二、基本I/O重定向 基本I/O重定向涉及到如何改变标准输入、输出和错误输出的目标。 - **输出重定向**: - `cmd > file`:将标准输出重定向到文件`file`中。 - `cmd >> file`:将标准输出追加到文件`file`中。 - `cmd 2>&1`:将标准错误输出重定向到与标准输出相同的位置。 - **输入重定向**: - `cmd < file`:将文件`file`作为命令的标准输入。 - `cmd << delimiter`:从标准输入中读取内容,直到遇到`delimiter`分界符为止。 - **同时重定向输入和输出**: - `cmd < file1 > file2`:使用`file1`作为标准输入,并将标准输出重定向到`file2`中。 - `cat <> file`:以读写模式打开文件`file`。 #### 三、进阶I/O重定向 进阶的I/O重定向涉及到更复杂的文件描述符操作。 - **文件描述符复制**: - `>&n`:复制文件描述符`n`作为标准输出。 - `<&n`:将标准输入复制自文件描述符`n`。 - `<&-`:关闭标准输入。 - `>&-`:关闭标准输出。 - **特定文件描述符的操作**: - `2> file`:运行命令并将错误输出重定向到`file`。 - `2>&1`:运行命令并将标准输出和错误输出合并(通过复制文件描述符1到2实现)。 - `n<&-`:关闭文件描述符`n`的输入。 - `n>&-`:关闭文件描述符`n`的输出。 - **示例**: - `exec 0 exec 1 > outfilename`:打开文件`outfilename`作为标准输出。 - `exec 2 > errfilename`:打开文件`errfilename`作为标准错误输出。 - `exec 0<&-`:关闭文件描述符0。 - `exec 1>&-`:关闭文件描述符1。 - `exec 5>&-`:关闭文件描述符5。 #### 四、示例 下面通过具体示例进一步理解I/O重定向的应用: 假设我们需要将两个命令的标准输出和标准错误输出都通过管道传递给`egrep`进行搜索,并将结果保存到文件中: ```sh (lsyouno 2>&1; lsyes 2>&1) 2>&1 | egrep '>' > file ``` 在这个例子中: - `lsyouno 2>&1` 将命令`lsyouno`的标准错误输出重定向到标准输出。 - `lsyes 2>&1` 将命令`lsyes`的标准错误输出重定向到标准输出。 - `2>&1` 再次将这两个命令的标准输出合并,使得它们都通过管道传递给`egrep`。 - `egrep '>'` 使用`egrep`命令搜索输出中的">"字符。 - `> file` 最终将结果保存到文件`file`中。 以上示例展示了如何利用I/O重定向来实现更复杂的任务处理。理解和掌握这些概念对于高效使用Linux系统至关重要。