介绍
Linux 中内置的重定向功能为您提供了一组强大的工具,用于使各种任务更容易完成。 无论您是编写复杂的软件还是通过命令行执行文件管理,知道如何在您的环境中操作不同的 I/O 流将大大提高您的工作效率。
流
Linux 环境中的输入和输出分布在三个流中。 这些流是:
- 标准输入 (stdin)
- 标准输出 (stdout)
- 标准错误 (stderr)
流也有编号:
- 标准输入 (0)
- 标准输出 (1)
- 标准错误 (2)
在用户与终端的标准交互过程中,标准输入通过用户的键盘进行传输。 标准输出和标准错误以文本形式显示在用户终端上。 这三个流统称为标准流。
标准输入
标准输入流通常将数据从用户传送到程序。 期望标准输入的程序通常接收来自设备的输入,例如键盘。 标准输入在到达 EOF(文件结尾)时终止。 如其名称所述,EOF 表示没有更多数据要读取。
要查看实际的标准输入,请运行 cat 程序。 Cat 代表 concatenate,意思是链接或组合某些东西。 它通常用于组合两个文件的内容。 当单独运行时,cat 打开一个循环提示。
cat
打开 cat 后,在它运行时键入一系列数字。
1 2 3 ctrl-d
当您输入一个数字并按回车键时,您正在将标准输入发送到正在运行的 cat 程序,该程序正在等待所述输入。 反过来,cat 程序将您的输入作为标准输出发送回终端显示。
用户可以通过按 ctrl-d 输入 EOF。 cat 程序收到 EOF 后停止。
标准输出
标准输出写入程序生成的数据。 当标准输出流没有被重定向时,它会将文本输出到终端。 试试下面的例子:
echo Sent to the terminal through standard output
当不带任何附加选项使用时,echo 命令会显示在命令行上传递给它的任何参数。 参数是程序接收到的东西。
运行 echo 不带任何参数:
echo
它将返回一个空行,因为没有参数。
标准误差
标准错误写入由在执行过程中某个时间点失败的程序生成的错误。 与标准输出一样,此流的默认目标是终端显示。
当一个程序的标准错误流通过管道传输到第二个程序时,管道数据(由程序错误组成)也同时发送到终端。
让我们看一个使用 ls 命令的标准错误的基本示例。 ls 列出目录的内容。
当不带参数运行时, ls 列出当前目录中的内容。 如果 ls 使用目录作为参数运行,它将列出所提供目录的内容。
ls %
由于 % i 不是现有目录,这会将以下文本发送到标准错误:
ls: cannot access %: No such file or directory
流重定向
Linux 包括每个流的重定向命令。 这些命令将标准输出写入文件。 如果以不存在的文件为目标(通过单括号或双括号命令),则将在写入之前创建具有该名称的新文件。
带有单括号 的命令覆盖 目标的现有内容。
覆盖
- > - 标准输出
- < - 标准输入
- 2> - 标准错误
带有双括号 的命令不会 覆盖目标的现有内容。
附加
- >> - 标准输出
- << - 标准输入
- 2>> - 标准错误
让我们看一个例子:
cat > write_to_me.txt a b c ctrl-d
在这里, cat 用于写入文件,该文件是循环创建的。
使用 cat 查看 write_to_me.txt 的内容:
cat write_to_me.txt
它应具有以下内容:
a b c
再次将 cat 重定向到 write_to_me.txt,并输入三个数字。
cat > write_to_me.txt 1 2 3 ctrl-d
当您使用 cat 查看 write_to_me.txt 时,您会看到以下内容:
1 2 3
先前的内容不再存在,因为该文件已被单括号命令覆盖。
再做一次 cat 重定向,这次使用双括号:
cat >> write_to_me.txt a b c ctrl-d
再次打开 write_to_me.txt,你会看到:
1 2 3 a b c
该文件现在包含 cat 两种用法的文本,因为第二个没有覆盖第一个。
管道
管道用于将流从一个程序重定向到另一个程序。 当一个程序的标准输出通过管道发送到另一个程序时,第二个程序接收到的第一个程序的数据将不会显示在终端上。 只会显示第二个程序返回的过滤数据。
Linux pipe 用竖线表示。
*|*
使用管道的命令示例:
ls | less
这将获取 ls 的输出,它显示当前目录的内容,并将 pipes 输出到 less 程序。 less 一次显示一行发送给它的数据。
ls 通常跨多行显示目录内容。 当你通过 less 运行它时,每个条目都放在一个新行上。
尽管管道的功能可能看起来类似于 > 和 >>(标准输出重定向),但区别在于管道将数据从一个命令重定向到另一个命令,而> 和 >> 用于专门重定向到文件。
过滤器
Filters 是改变管道重定向和输出的命令。 请注意,过滤器命令也是可以在没有管道的情况下使用的标准 Linux 命令。
- find - Find 返回文件名与传递给 find 的参数匹配的文件。
- grep - Grep 返回与传递给 grep 的字符串模式匹配的文本。
- tee - Tee 将标准输入重定向到标准输出和一个或多个文件。
- tr - tr 查找并用另一个字符串替换。
- wc - wc 统计字符、行和单词。
例子
现在您已经了解了重定向、管道和基本过滤器,让我们看一些基本的重定向模式和示例。
命令 > 文件
此模式将命令的标准输出重定向到文件。
ls ~ > root_dir_contents.txt
上面的命令将系统根目录的内容作为标准输出传递,并将输出写入名为 root_dir_contents.txt 的文件。 它将删除文件中任何先前的内容,因为它是一个单括号命令。
命令 > /dev/null
/dev/null 是一个特殊文件,用于丢弃重定向到它的任何数据。 它用于丢弃不需要的标准输出,否则可能会干扰命令或脚本的功能。 发送到 /dev/null 的任何输出都将被丢弃。 以后在写shell脚本的时候可能会发现将标准输出和标准错误重定向到/dev/null的做法。
ls > /dev/null
此命令通过将命令 ls 返回的标准输出流传递给 /dev/null 来丢弃它。
命令 2> 文件
此模式将命令的标准错误流重定向到文件,覆盖现有内容。
mkdir '' 2> mkdir_log.txt
这将重定向由无效目录名称 ' 引发的错误,并将其写入 log.txt。 请注意,错误仍会发送到终端并显示为文本。
命令>>文件
此模式将命令的标准输出重定向到文件 而不会覆盖文件的现有内容。
echo Written to a new file > data.txt echo Appended content to an existing file >> data.txt
这对命令首先将用户通过 echo 输入的文本重定向到一个新文件。 然后,它将第二个 echo 命令接收到的文本附加到现有文件中,而不覆盖其内容。
命令 2>> 文件
上面的模式将命令的标准错误流重定向到文件 而不会 覆盖文件的现有内容。 此模式对于为程序或服务创建错误日志很有用,因为每次写入文件时不会擦除日志文件以前的内容。
find '' 2> stderr_log.txt wc '' 2>> stderr_log.txt
上述命令将由无效 find 参数引起的错误消息重定向到名为 stderr_log.txt 的文件。 然后它将由无效 wc 参数引起的错误消息附加到同一文件中。
命令 | 命令
将第一个命令的标准输出重定向到第二个命令的标准输入。
find /var lib | grep deb
此命令在 /var 及其子文件夹中搜索与字符串 deb 匹配的文件名和扩展名,并返回文件的文件路径,每个路径中的匹配部分以红色突出显示。
命令 | 三通文件
此模式(包括 tee 命令)将命令的标准输出重定向到文件并覆盖其内容。 然后,它在终端中显示重定向的输出。 如果文件不存在,它会创建一个新文件。
在此模式的上下文中,tee 通常用于查看程序的输出,同时将其保存到文件中。
wc /etc/magic | tee magic_count.txt
这会将魔法文件(Linux shell 用于确定文件类型)中的字符、行和单词的计数传送到 tee 命令,然后将 wc 的输出拆分为两个方向,并将其发送到终端显示器和 magic_count .txt 文件。 对于 tee 命令,想象一下字母 T。 字母的底部是初始数据,顶部是被拆分为两个不同方向(标准输出和终端)的数据。
多个管道可用于跨多个命令和/或过滤器重定向输出。
命令 | 命令 | 命令>>文件
此模式预先定向第一个命令的标准输出,并通过接下来的两个命令对其进行过滤。 然后它将最终结果附加到文件中。
ls ~ | grep *tar | tr e E >> ls_log.txt
首先在根目录 (~) 中运行 ls 并将结果传送到 grep 命令。 在这种情况下,grep 返回文件名或扩展名中包含 tar 的文件列表。
然后将 grep 的结果通过管道传送到 tr,它将出现的字母 e 替换为 E,因为 e 作为第一个参数(要搜索的字符串)传递,并且E 作为第二个参数(替换第一个参数的任何匹配项的字符串)传递。 然后将此最终结果附加到文件 ls_log.txt,如果它不存在则创建该文件)。
结论
学习如何使用 Linux 命令行中内置的重定向功能可能有点令人生畏,但在完成本教程后,您就可以很好地掌握这些技能了。 现在您已经了解了重定向和管道如何工作的基础知识,您将能够开始涉足 shell 脚本世界,它经常使用本指南中重点介绍的程序和模式。
如果您想深入了解本教程中介绍的命令,可以使用 man command | 少。 例如:
man tee | less
这将显示可用于 tee 程序的命令的完整列表。 您可以使用此模式来显示任何 Linux 命令或程序的信息和使用选项。
谷歌搜索特定的命令,或者你想在命令行中做的事情(例如 当您需要使用命令行完成特定任务时,“删除目录中以大写字母开头的所有文件”也很有帮助。