9-IO重定向

 从字面意思上将,数据流重定向就是将“数据给他传导到其他地方去”。
 实际上也没错,数据流重导向就是将某个命令运行后应该要出现在屏幕上的数据,给他传输到其他的地方,例如文件或者是装置 (例如打印机之类的)。

 我们知道,计算机中输入输出分为三种: - 标准输入: stdin - 标准输出: stdout - 标准错误输出: stderr

 我们利用数据流重导向可以将上述三者分开(主要是stdout和stderr)

  • stdin :代码为 0 ,使用 < 或 <<
  • stdout :代码为 1 ,使用 > 或 >>
  • stderr :代码为 2 ,使用 2> 或 2>>

stdout

  • >

    重定向,将正确的内容覆盖性写入文件中

  • >>

    重定向,将正确的内容追加写入文件中

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
zuo@zuo-VirtualBox:~/Sample$ echo "目录树" > rcd
zuo@zuo-VirtualBox:~/Sample$ tree >> rcd
zuo@zuo-VirtualBox:~/Sample$ echo "src.cpp的前3行" >> rcd
zuo@zuo-VirtualBox:~/Sample$ head -n 3 >> rcd
zuo@zuo-VirtualBox:~/Sample$ head -n 3 src.cpp >> rcd
zuo@zuo-VirtualBox:~/Sample$ cat rcd
目录树
.
├── 1
├── rcd
└── src.cpp

1 directories, 2 files
src.cpp的前3行
#include <iostream>
#include <vector>
using namespace std;

stderr

  • 2>
  • 2>>

 将错误的信息进行重定向

1
2
3
4
5
6
7
8
9
10
11
# 将报错信息重定向到文件Stderr中
zuo@zuo-VirtualBox:~/Sample$ py-thon Temp.py 2> Stderr
zuo@zuo-VirtualBox:~/Sample$ cat Stderr

Command 'py-thon' not found, did you mean:

command 'python' from deb python3
command 'python' from deb python
command 'python' from deb python-minimal

Try: sudo apt install <deb name>

利用重定向将正确输出和保存信息分开

 比如有Temp.py如下

1
2
3
4
# -*- coding: utf-8 -*-
l = ['1', '2', 'a']
for x in l:
print(int(x))

 如果直接运行:

1
2
3
4
5
6
7
zuo@zuo-VirtualBox:~/Sample$ python Temp.py 
1
2
Traceback (most recent call last):
File "Temp.py", line 4, in <module>
print(int(x))
ValueError: invalid literal for int() with base 10: 'a'

 利用重定向,可以把两股数据流分开

1
2
3
4
5
6
7
8
9
zuo@zuo-VirtualBox:~/Sample$ python Temp.py > Stdout 2> Stderr
zuo@zuo-VirtualBox:~/Sample$ cat Stdout; echo "----"; cat Stderr
1
2
----
Traceback (most recent call last):
File "Temp.py", line 4, in <module>
print(int(x))
ValueError: invalid literal for int() with base 10: 'a'

stdin

  • <
  • <<

 以最简单的说法来说, stdin的重定向就是 “将原本需要由键盘输入的数据,改由文件内容来取代” 的意思。 我们先由底下的 cat 命令操作来了解一下什么叫做“键盘输入”。我们前面提到过,如果cat指令不带文件名,就是从标准输入流读取并打印在屏幕上的意思,利用stdout我们可以实现对文件的直接输入:

1
2
3
4
5
6
7
8
9
10
# 输入并重定向
zuo@zuo-VirtualBox:~$ cat > temp
This is file "/home/zuo/temp"
It was builed with the command "cat > temp"
Hello World!
# 文件被建立起来了
zuo@zuo-VirtualBox:~$ cat temp
This is file "/home/zuo/temp"
It was builed with the command "cat > temp"
Hello World!

 利用对 stdin 的重定向,我们可以用纯文本文件取代键盘的输入,也就是说,用某个文件的内容来取代键盘的敲击:

1
2
3
4
5
6
# 将标准输入重定向为从文件 temp 中读取
zuo@zuo-VirtualBox:~$ (cat > temp2) < temp
zuo@zuo-VirtualBox:~$ cat temp2
This is file "/home/zuo/temp"
It was builed with the command "cat > temp"
Hello World!