在 Linux 终端中使用重定向从任何位置读取和写入数据

重定向是一种从一个位置获取数据到另一个位置的有效方法,无需大量鼠标移动和按键。
98 位读者喜欢这篇文章。
hands programming

WOCinTech Chat。由 Opensource.com 修改。CC BY-SA 4.0

输入和输出的重定向是任何编程或脚本语言的自然功能。从技术上讲,每当您与计算机交互时,它都会自然而然地发生。输入从 stdin(标准输入,通常是您的键盘或鼠标)读取,输出到 stdout(标准输出,文本或数据流),错误发送到 stderr。了解这些数据流的存在使您可以在使用 shell(例如 BashZsh)时控制信息的去向。

标准输入、标准输出和标准错误作为文件系统位置存在于 Linux 中。您可以在 /dev 中看到它们

$ ls /dev/std*
/dev/stderr@  /dev/stdin@  /dev/stdout@

您不能直接对它们做太多事情,但有时将它们视为可以发送数据的元位置很有用。

重定向的基础知识很简单:使用一些 > 字符来重定向输出,并使用一些 < 字符来重定向输入。

重定向输出

要将 ls 命令的输出写入文件

$ ls > list.txt

您不会像通常那样看到 ls 的输出,因为输出被写入 list.txt 文件而不是您的屏幕。事实上,这非常通用,您甚至可以使用它将一个文件的内容复制到另一个文件。它也不必是文本文件。您可以将重定向用于二进制数据

$ cat image.png > picture.png

(如果您想知道为什么您会想要这样做,那是因为它对 文件权限 有时会产生有用的影响。)

重定向输入

您也可以将输入重定向“到”命令中。可以说,这不如重定向输出有用,因为许多命令已经被硬编码为从您提供的参数中获取输入。但是,当命令需要参数列表,并且您将这些参数放在文件中并希望快速将它们从文件“复制并粘贴”到终端中时(除了您实际上不想复制和粘贴),这可能很有用

$ sudo dnf install $(<package.list)

输入重定向的常见用法是 here-document(或简称 here-doc)和 here-string 技术。 此输入方法将文本块重定向到标准输入流中,直到特殊的 end-of-file 标记(大多数人使用 EOF,但它可以是您期望是唯一的任何字符串)。尝试在终端中输入以下内容(直到第二个 EOF 实例)

$ echo << EOF
> foo
> bar
> baz
> EOF

预期结果

foo
bar
baz

Here-docBash 脚本编写者常用的技巧,用于将多行文本转储到文件或屏幕上。只要您不忘记用 end-of-file 标记结束子句,它就是避免笨拙的 echoprintf 语句列表的有效方法。

Here-string 类似于 here-doc,但它仅由一个字符串(或几个用引号伪装成单个字符串的字符串)组成

$ cat <<< "foo bar baz"
foo bar baz

重定向错误消息

错误消息转到名为 stderr 的流,指定为 2> 用于重定向。此命令将错误消息定向到名为 output.log 的文件

$ ls /nope 2> output.log

将数据发送到 /dev/null

正如标准输入、标准输出和错误有位置一样,Linux 文件系统上也有一个 无处 的位置。它被称为 null,位于 /dev 中,因此经常被那些使用它太频繁以至于不想说“斜杠 dev 斜杠 null”的人发音为“devnull”。

您可以使用重定向将数据发送到 /dev/null。例如,find 命令往往很冗长,并且在搜索文件时经常报告权限冲突

$ find ~ -type f 
/home/seth/actual.file
find: `/home/seth/foggy': Permission denied
find: `/home/seth/groggy': Permission denied
find: `/home/seth/soggy': Permission denied
/home/seth/zzz.file

find 命令将其作为错误处理,因此您可以仅将错误消息重定向到 /dev/null

$ find ~ -type f 2> /dev/null
/home/seth/actual.file
/home/seth/zzz.file

使用重定向

重定向是在 Bash 中将数据从一个位置移动到另一个位置的有效方法。您可能不会一直使用重定向,但是学习在需要时使用它可以为您节省大量不必要的打开文件和复制粘贴数据的时间,所有这些通常都需要鼠标移动和大量按键。不要诉诸如此极端的方式。享受美好生活并使用重定向。

接下来阅读

开始 Bash 编程

学习如何用 Bash 编写自定义程序来自动化您的重复性任务。下载我们的新电子书开始学习。

Seth Kenlon
Seth Kenlon 是一位 UNIX 极客、自由文化倡导者、独立多媒体艺术家和 D&D 爱好者。他曾在电影和计算机行业工作,并且经常同时进行。

5 条评论

仅供参考:像这样的简单重定向并非在所有情况下都有效。特别是,如果您对生成另一个 shell 进程的脚本进行输出重定向。这就是为什么我想知道您为什么没有提到一个名为 `script` 的工具:script -c "./my-script" log.txt

请继续关注。有一篇关于 script 的文章即将作为单独的主题发布。

回复 ,作者:Andrejs (未验证)

精彩的文章,我喜欢

不错

这是很棒的信息。正是我要找的。谢谢你。你们太棒了!

Creative Commons License本作品根据 Creative Commons Attribution-Share Alike 4.0 International License 获得许可。
© . All rights reserved.