![0f8bc976158729f8291af15f54e2c4be.png](https://img8.php1.cn/3cdc5/189d8/78c/af2e061046f762c1.jpeg)
本文字数:2467,阅读时长大约:3分钟
导读:重定向是一种十分高效的数据流动方式,它能帮你减少很多鼠标和键盘上的操作。https://linux.cn/article-12385-1.html作者:Seth Kenlon译者:jx.zeng
对于任何编程或脚本语言,输入与输出重定向都是很自然的功能。严格来说,当你使用电脑时,数据自然而然地在发生着重定向。从 stdin
(标准输入,通常是你的键盘或者鼠标)读取输入,输入则发往 stdout
(标准输出,一段文本或者数据流),最后错误信息送至 stderr
。如果你使用 Bash 或 Zsh 之类的 shell,那么理解这些数据流能够让你更好地控制信息流向。
标准输入、标准输出以及标准错误输出都存在于 Linux 文件系统中。你可以在 /dev
查看:
$ ls /dev/std*
/dev/stderr@ /dev/stdin@ /dev/stdout@
你可能没法直接使用它们,但将它们想象成你能传递数据的元位置,会很有帮助。
重定向的基础很简单:用一些 >
符号重定向输出&#xff0c;然后用另外一些 <
符号重定向输入。
![ea7fdd9c-f12d-eb11-8da9-e4434bdf6706.svg](https://img.php1.cn/3cd4a/1eebe/cd5/bff2716168d1ed7b.webp > picture.png</code></code><p>(你可能会好奇为什么要这样做&#xff0c;有时候对于 文件权限信息 而间接有用。)</p><img src=)
重定向输入
你也能将输入重定向“到”一个命令。可以说&#xff0c;它没有重定向输出那么有用&#xff0c;因为许多命令已经被硬编码&#xff0c;只从你的参数中接收输入。但是&#xff0c;如果某个命令需要一系列参数&#xff0c;而且你把这些参数写在文件里&#xff0c;想要快速“复制粘贴”到终端的时候(除非你并不想复制粘贴)&#xff0c;它就帮得上忙了。
$ sudo dnf install $(
重定向输入得常规用法是嵌入文档(here-document)(简写成 here-doc)和嵌入字符串(here-string) 技巧。这种输入方法将一整块文本重定向至标准输入流&#xff0c;直到碰见一个特殊的文件结束标记(许多人习惯用 EOF
&#xff0c;实际上你可以使用任何字符串&#xff0c;只要它是唯一的)。试着把这些(在第二个 EOF
标记之前)敲进你的终端&#xff1a;
$ echo <> foo
> bar
> baz
> EOF
输出结果&#xff1a;
foo
bar
baz
使用 Bash 编写脚本的人常常用这个技巧&#xff0c;将数行文本一次性写入文件或者打印到屏幕上。只要你别忘了末尾的文件结束标记&#xff0c;这会是一个帮你避免大量繁琐 echo 或 printf
语句的好办法。
嵌入字符串类似于嵌入文档&#xff0c;但是它只含有一个字符串(或者用引号包裹的几个字符串&#xff0c;同样会被当成一个字符串)
$ cat <<<"foo bar baz"
foo bar baz
![ea7fdd9c-f12d-eb11-8da9-e4434bdf6706.svg](http://p02.5ceimg.com/content/ea7fdd9c-f12d-eb11-8da9-e4434bdf6706.svg)
重定向错误信息
错误信息流叫做 stderr
&#xff0c;通过 2>
实现这个目的。下面这个命令把错误信息定向到 output.log
文件&#xff1a;
$ ls /nope 2> output.log
![ea7fdd9c-f12d-eb11-8da9-e4434bdf6706.svg](http://p02.5ceimg.com/content/ea7fdd9c-f12d-eb11-8da9-e4434bdf6706.svg)
将数据送往 /dev/null
既然标准输入、标准输出和错误输出都有自己的位置&#xff0c;那么“空空如也”也应该在 Linux 文件系统占有一席之地。没错&#xff0c;它叫做 null
&#xff0c;位于 /dev
&#xff0c;频繁使用的人懒得说 “slash dev slash null”&#xff0c;于是索性叫它 “devnull”。
通过重定向&#xff0c;你可以把数据发送到 /dev/null
。比如&#xff0c;find 命令常常会输出很多具体信息&#xff0c;而且在搜索文件遇到权限冲突时&#xff0c;会事无巨细地报告&#xff1a;
$ find ~ -type f
/home/seth/actual.file
find: &#96;/home/seth/foggy&#39;: Permission denied
find: &#96;/home/seth/groggy&#39;: Permission denied
find: &#96;/home/seth/soggy&#39;: Permission denied
/home/seth/zzz.file
find 命令把那些当作错误&#xff0c;所以你可以只把错误信息重定向至 /dev/null
&#xff1a;
$ find ~ -type f 2> /dev/null
/home/seth/actual.file
/home/seth/zzz.file
![ea7fdd9c-f12d-eb11-8da9-e4434bdf6706.svg](http://p02.5ceimg.com/content/ea7fdd9c-f12d-eb11-8da9-e4434bdf6706.svg)
使用重定向
在 Bash 中&#xff0c;重定向是转移数据的有效方法。你可能不会频繁使用重定向&#xff0c;但是学会如何使用它&#xff0c;能帮你在打开文件、复制粘贴数据这类需要移动鼠标、大量按键操作上&#xff0c;节省很多不必要的时间。不要做如此浪费时间的事情。使用重定向&#xff0c;好好享受生活。
via: https://opensource.com/article/20/6/redirection-bash
作者&#xff1a;Seth Kenlon 选题&#xff1a;lujun9972 译者&#xff1a;nophDog 校对&#xff1a;wxy
本文由 LCTT 原创编译&#xff0c;Linux中国 荣誉推出
![f37fdd9c-f12d-eb11-8da9-e4434bdf6706.svg](http://p04.5ceimg.com/content/f37fdd9c-f12d-eb11-8da9-e4434bdf6706.svg)