输出重定向

相较于输入重定向,我们使用输出重定向的频率更高,且更容易理解,所以这里先介绍输出重定向。

1. > 和 >>

两个区别在于>是重定向到一个文件,>>是追加内容到一个文件。如果文件不存在,那么这两个命令都会首先创建这个文件。

和输入重定向不同的是,输出重定向还可以细分为标准输出重定向和错误输出重定向两种技术。

2. 1> 和 2>

他们两个用于将一个文件正确的输出,和错误的输出分开保存。

1> 将正确的输出重定向到某个文件

2> 将错误的输出重定向到某个文件

将错误输出和正确输出保存到同一个文件:

command 1> a.txt 2>&1
# 或者写作
command > a.txt 2>&1

3. 1>> 和 2>>

同理1>> 2>>其实也就是追加数据到文件中,和前面介绍的>>没有什么不同,需要提到的一点是,如果我们想将错误的和正确的信息重定向追加到同一个文件应该怎么做呢?你可能会想到2>>&1。。。然而现实是,并没有这个语法。

然而我们却可以使用1 >> a.txt 2>&1的语法实现这个功能,比如:

command 1>> a.txt 2>&1

看似1> 1>> 2> 2>>是相一一对应的,但是其实不是,他们可以混用,比方说正确的结果想追加,错误的结果我想覆盖。

command 1>> right.txt 2> wrong.txt

如果我们想保存正确的结果,错误的结果直接丢向垃圾站,既不保存为文件,也不在标准输出打印又该怎么做呢?

command 1>> right.txt 2> /dev/null

直接将错误输出重定向到/dev/null就好了,他好像就是一个无底洞,丢进去的东西就不见了。

示例

新建一个包含有 “Linux” 字符串的文本文件 Linux.txt,以及空文本文件 demo.txt,然后执行如下命令:

[mika@localhost temp]$ cat Linux.txt > demo.txt
[mika@localhost temp]$ cat demo.txt
Linux
[mika@localhost temp]$ cat Linux.txt > demo.txt
[mika@localhost temp]$ cat demo.txt
Linux     # 这里的 Linux 是清空原有的 Linux 之后,写入的新的 Linux
[mika@localhost temp]$ cat Linux.txt >> demo.txt
[mika@localhost temp]$ cat demo.txt
Linux
Linux     # 以追加的方式,新数据写入到原有数据之后
[mika@localhost temp]$ cat b.txt > demo.txt
cat: b.txt: No such file or directory  # 错误输出信息依然输出到了显示器中
[mika@localhost temp]$ cat b.txt 2> demo.txt
[mika@localhost temp]$ cat demo.txt
cat: b.txt: No such file or directory  # 清空文件,再将错误输出信息写入到该文件中
[mika@localhost temp]$ cat b.txt 2>> demo.txt
[mika@localhost temp]$ cat demo.txt
cat: b.txt: No such file or directory
cat: b.txt: No such file or directory  # 追加写入错误输出信息

输入重定向

1. < 和 <<

命令符号格式

作用

命令 < 文件

将指定文件作为命令的输入设备

命令 << 分界符

表示从标准输入设备(键盘)中读入,直到遇到分界符才停止(读入的数据不包括分界符),这里的分界符其实就是自定义的字符串

示例1 :

[mika@localhost temp]$ echo hello world > 1.txt
[mika@localhost temp]$ cat 1.txt 
hello world
[mika@localhost temp]$ echo $(<1.txt )
hello world

示例2

[mika@localhost temp]$ cat <<1
> hello
> world
> 0
> 1
hello
world
0

可以看到,当指定了 1 作为分界符之后,只要不输入 1,就可以一直输入数据。

示例4:

综合运用输入输出重定向,简单写个例子

[mika@localhost temp]$ cat 1.txt 
hello world
[mika@localhost temp]$ echo $(<1.txt) >>1.txt
[mika@localhost temp]$ cat 1.txt 
hello world
hello world