有过一段时间 Linux 使用经历的人都知道,Linux 中的重定向符有输出重定向符(>,>>)和输入重定向符(<,<<)。
输出重定向符可以把执行命令原本显示在屏幕上的内容写入到指定的文件中,如:
root@33e53512c13d ~ [19:39:44]
> # echo 123 > a
root@33e53512c13d ~ [19:40:18]
> # cat a
123
> 与 >> 的区别在于,> 是覆盖写入文件,而 >> 是在文件末尾接着写。
root@33e53512c13d ~ [19:39:44]
> # echo 123 > a
root@33e53512c13d ~ [19:40:18]
> # cat a
123
root@33e53512c13d ~ [19:40:24]
> # echo 456 > a
root@33e53512c13d ~ [19:42:25]
> # cat a
456
root@33e53512c13d ~ [19:42:27]
> # echo 789 >> a
root@33e53512c13d ~ [19:42:35]
> # cat a
456
789
输入重定向符是将文件内容重定向到命令,如:
root@33e53512c13d ~ [19:42:35]
> # cat a
456
789
root@33e53512c13d ~ [19:42:37]
> # wc < a
2 2 8
而输入重定向符对应的 << 称为内联输入重定向符,这种方法无需使用文件进行重定向,只需要在命令行中指定用于输入重定向的数据就可以了。
内联输入重定向符号是远小于号( <<)。除了这个符号,你必须指定一个文本标记来划分输入数据的开始和结尾。任何字符串都可作为文本标记,但在数据的开始和结尾文本标记必须一致。
root@33e53512c13d ~ [19:45:45]
> # wc << a
heredoc> 1 2 3
heredoc> 4 5 6
heredoc> a
2 6 12
至此,Linux 的重定向符就基本介绍完了,很简单,一看就会。但是你真的就会了吗?给两个题目,如果你都能回答上来,就关了这个页面吧。
1.下面的命令输出什么?
root@33e53512c13d ~ [19:56:05]
> # >>t >>t echo 123
root@33e53512c13d ~ [19:57:18]
> # cat t
2.这个命令又输出什么?
root@33e53512c13d ~ [19:59:00]
> # echo 123 >a
root@33e53512c13d ~ [19:59:10]
> # cat a
123
root@33e53512c13d ~ [19:59:11]
> # <a wc
乍一看,这个两个命令好像不大对啊,因为我们在学重定向符的时候,都会产生一种错觉:重定向符是“双目的”。然而事实上,重定向符类似无缓存的 channel ,一个重定向符 “声明” 一个 channel ,因此问题 1 中 “>>t >>t echo 123” 存在两个 channel。输入 channel 的“源头”是“无限”的,比如问题 1 中的 "echo 123" 可以认为是源源不断地输出 123 。源源不断的 123 通过两个 channel 输入到 t中,那么问题 1 的输出结果是:
root@33e53512c13d ~ [19:57:18]
> # cat t
123
123
问题2的输出为:
root@33e53512c13d ~ [19:59:11]
> # <a wc
1 1 4
并且,输出重定向符只有一个源头(输出内容的命令),输入重定向符只有一个尽头(输入内容的命令)。重定向符是从左到右开启 “channel” 的,如:
root@33e53512c13d ~ [20:16:18]
> # >> t echo bbb > t
root@33e53512c13d ~ [20:18:58]
> # cat t
bbb
root@33e53512c13d ~ [20:19:02]
> # > s echo bbb >> s
root@33e53512c13d ~ [20:19:17]
> # cat s
bbb
bbb
关于Linux命令的学习有本书推荐:Linux命令行与shell脚本编程大全第3版