Linux shell重定向

1 简介

在 Linux 的 shell 中,重定向是将命令的输入和输出重定向到不同的位置(如文件、设备或其他命令)。这使得 shell 可以灵活地处理数据流和日志记录。重定向主要涉及以下几种类型:标准输入(stdin)、标准输出(stdout)和标准错误输出(stderr)。

文件描述符

当执行shell命令时,会默认打开3个文件,每个文件有对应的文件描述符来方便我们使用:

类型 文件描述符 默认情况 对应文件句柄位置
标准输入(standard input) 0 从键盘获得输入 /proc/self/fd/0
标准输出(standard output) 1 输出到屏幕(即控制台) /proc/self/fd/1
错误输出(error output) 2 输出到屏幕(即控制台) /proc/self/fd/2

所以我们平时在执行shell命令中,都默认是从键盘获得输入,并且将结果输出到控制台上。但是我们可以通过更改文件描述符默认的指向,从而实现输入输出的重定向。比如我们将1指向文件,那么标准的输出就会输出到文件中。

2 输出重定向

输出重定向的使用方式很简单,基本的一些命令如下:

输出重定向命令及其说明

介绍 示例 解释
把标准输出重定向到新文件中,若文件已存在则覆盖 ls > output.txt ls 命令的标准输出写入 output.txt,若文件已存在则覆盖其内容
同上,明确指定标准输出 ls 1> output.txt 同上,明确指定标准输出
把标准输出追加到文件中,若文件不存在则创建 ls >> output.txt ls 命令的标准输出追加到 output.txt,若文件不存在则创建
同上,明确指定标准输出 ls 1>> output.txt 同上,明确指定标准输出
把标准错误重定向到新文件中,若文件已存在则覆盖 ls non_existing_file 2> error.txt ls 命令的标准错误写入 error.txt,若文件已存在则覆盖其内容
把标准错误追加到文件中,若文件不存在则创建 ls non_existing_file 2>> error.txt ls 命令的标准错误追加到 error.txt,若文件不存在则创建
把标准输出和标准错误都重定向到同一个新文件中 ls non_existing_file > output.txt 2>&1 ls 命令的标准输出和标准错误都写入 output.txt,若文件已存在则覆盖其内容
把标准输出和标准错误都追加到同一个文件中 ls non_existing_file >> output.txt 2>&1 ls 命令的标准输出和标准错误都追加到 output.txt,若文件不存在则创建
把标准输出和标准错误都重定向到新文件中(Bash特有) ls non_existing_file &> output.txt ls 命令的标准输出和标准错误都写入 output.txt,若文件已存在则覆盖其内容(Bash特有)
把标准输出和标准错误都追加到文件中(Bash特有) ls non_existing_file &>> output.txt ls 命令的标准输出和标准错误都追加到 output.txt,若文件不存在则创建(Bash特有)
把标准错误重定向到标准输出,然后将标准输出重定向到文件 ls non_existing_file 2>&1 > output.txt 先将 ls 命令的标准错误重定向到标准输出,然后将标准输出写入 output.txt
把标准输出重定向到标准错误 ls 1>&2 ls 命令的标准输出重定向到标准错误
把标准输出重定向到空设备,丢弃输出 ls > /dev/null ls 命令的标准输出重定向到 /dev/null,丢弃所有输出
把标准错误重定向到空设备,丢弃错误输出 ls non_existing_file 2> /dev/null ls 命令的标准错误重定向到 /dev/null,丢弃所有错误输出
把标准输出和标准错误都重定向到空设备,丢弃所有输出 ls non_existing_file > /dev/null 2>&1 ls 命令的标准输出和标准错误都重定向到 /dev/null,丢弃所有输出

我们使用>或者>>对输出进行重定向。符号的左边表示文件描述符,如果没有的话表示1,也就是标准输出,符号的右边可以是一个文件,也可以是一个输出设备。当使用>时,会判断右边的文件存不存在,如果存在的话就先删除,然后创建一个新的文件,不存在的话则直接创建。但是当使用>>进行追加时,则不会删除原来已经存在的文件。

2.1 /dev/null

/dev/null 是一个特殊的文件,通常被称为“空设备”。将输出重定向到 /dev/null 可以有效地丢弃不需要的输出。

2.2 2>&1

2>&1 用于将标准错误(文件描述符 2)重定向到标准输出(文件描述符 1)。这意味着错误消息将与标准输出混合在一起。

3 输入重定向

输入重定向命令及其说明

命令 介绍 示例 解释
command < filename 将文件内容作为命令的标准输入 sort < unsorted.txt unsorted.txt 的内容作为 sort 命令的输入,输出排序后的内容
command << EOF Here Document,将多行文本作为命令的标准输入 cat << EOF\nHello\nWorld\nEOF 将多行文本 “Hello\nWorld\n” 作为 cat 命令的输入,输出 “Hello\nWorld\n”
command <<< "string" Here String,将字符串作为命令的标准输入 grep "Hello" <<< "Hello World" 将字符串 “Hello World” 作为 grep 命令的输入,查找 “Hello” 子字符串