输入和输出的重定向是任何编程或脚本语言的自然功能。从技术上讲,每当您与计算机交互时,它都会自然而然地发生。输入从 stdin
(标准输入,通常是您的键盘或鼠标)读取,输出到 stdout
(标准输出,文本或数据流),错误发送到 stderr
。了解这些数据流的存在使您可以在使用 shell(例如 Bash 或 Zsh)时控制信息的去向。
标准输入、标准输出和标准错误作为文件系统位置存在于 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-doc 是 Bash 脚本编写者常用的技巧,用于将多行文本转储到文件或屏幕上。只要您不忘记用 end-of-file 标记结束子句,它就是避免笨拙的 echo
或 printf
语句列表的有效方法。
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 中将数据从一个位置移动到另一个位置的有效方法。您可能不会一直使用重定向,但是学习在需要时使用它可以为您节省大量不必要的打开文件和复制粘贴数据的时间,所有这些通常都需要鼠标移动和大量按键。不要诉诸如此极端的方式。享受美好生活并使用重定向。
5 条评论