重定向
Linux Shell 重定向分为两种,一种输入重定向,一种是输出重定向;
- 输入方向就是数据从哪里流向程序。数据默认从键盘流向程序,如果改变了它的方向,数据就从其它地方流入,这就是输入重定向。
- 输出方向就是数据从程序流向哪里。数据默认从程序流向显示器,如果改变了它的方向,数据就流向其它地方,这就是输出重定向。
文件描述符
Linux 中一切皆文件,包括标准输入设备(键盘)和标准输出设备(显示器)在内的所有计算机硬件都是文件。
为了表示和区分已经打开的文件,Linux 会给每个文件分配一个 ID,这个 ID 就是一个整数,被称为文件描述符(File Descriptor)。
1 | 0 stdin 标准输入文件 键盘 |
stdin、stdout、stderr 默认都是打开的,在重定向的过程中,0、1、2 这三个文件描述符可以直接使用。
输出重定向
输出重定向是指命令的结果不再输出到显示器上,而是输出到其它地方,一般是文件中。这样做的最大好处就是把命令的结果保存起来,当我们需要的时候可以随时查询。
1 | command >file 以覆盖的方式,把 command 的正确输出结果输出到 file 文件中。 |
在输出重定向中,>代表的是覆盖,>>代表的是追加。
输出重定向的完整写法其实是fd>file或者fd>>file,其中 fd 表示文件描述符,如果不写,默认为 1,也就是标准输出文件。
fd和>之间不能有空格,否则 Shell 会解析失败
正确结果和错误信息保存在一个文件:
1 | ls -l >out.log 2>&1 |
把正确结果和错误信息分开保存到不同的文件中,也即写成下面的形式:
ls -l >>out.log 2>>err.log
如果你既不想把命令的输出结果保存到文件,也不想把命令的输出结果显示到屏幕上,干扰命令的执行:
ls -l &>/dev/null
大家可以把 /dev/null 当成 Linux 系统的垃圾箱,任何放入垃圾箱的数据都会被丢弃,不能恢复。
输入重定向
输入重定向就是改变输入的方向,不再使用键盘作为命令输入的来源,而是使用文件作为命令的输入。
1 | command <file 将 file 文件中的内容作为 command 的输入。 |
统计文档中有多少行文字:
1 | wc -l <readme.txt 输入重定向 |
输入重定向符号<<,这个符号的作用是使用特定的分界符作为命令输入的结束标志,而不使用 Ctrl+D 键。
1 | wc -l <<END |
wc 命令会一直等待用输入,直到遇见分界符 END 才结束读取。
<<之后的分界符可以自由定义,只要再碰到相同的分界符,两个分界符之间的内容将作为命令的输入。