我们知道,在Linux中一切皆文件。这就意味着,任何一个设备在系统中都有一个文件与之对应。因此我们就可以通过文件来访问设备。对于用户来讲,访问文件就是通过文件名来进行的,用户看到就是一个文件名,但对于内核来说,看到的只能是数字,这个数字就叫做文件描述符,内核就是通过利用文件描述符fd(file descriptor)来访问文件。打开现存文件或者新建文件时,内核会返回一个文件描述符。读写文件也需要使用文件描述符来指定待读写的文件。

    在Linux系统中,默认有三种标准输入输出情况

    标准输入:键盘,0

    标准输出:显示器,1

    标准错误输出:显示器,2

    

    但是如果我们不想实现标准的输入输出怎么办,因此我们可以利用I/O重定向这种机制来实现改变标准位置。下面来说下I/O重定向的具体用法:

    

IO重定向:


输出重定向:>

特性:覆盖输出

输出重定向:>>

特性:追加输出


# set -C

禁止覆盖输出重定向至已存在的文件;

此时可使用强制输出覆盖:>

# set +C

关闭上述特性


错误输出流重定向:2>,2>>


合并正常输出流和错误输出流:

(1) &>,&>>

(2) COMMAND > /path/to/somefile 2>&1

COMMAND >> /path/to/somefile 2>&1



特殊设备:/dev/null


输入重定向:<


tr命令:

tr [OPTION]... SET1 [SET2]

把输入的数据当中的字符,凡是在SET1定义范围内出现的,统统对位转换成SET2出现的字符;


用法1:

tr SET1 SET2 < /PATH/FROM/SOMELIFE

用法2:

tr SET1 -d < /PATH/FROM/SOMELIFE


注意:不修改原文件


Here Document: <<


cat << EOF

cat >/PATH/TO/SOMELIFE << EOF


管道:连接程序,实现将前一个命令的输出直接定向后一个程序当做输入数据流;

COMMAND1 | COMMOND2 | COMMAND3 |...

                            STDERR默认不能通过管道转发,可利用2>&1 或|& 实现

最后一个命令会在当前shell进程的子shell进程中执行用来

tee命令:

COMMAND | tee /PATH/TO/SOMELIFE


练习题:

1、将/etc/issue文件中的内容转换为大写后保存至/tmp/issue.out文件中

Linux bash中I/O重定向及管道_Linux


2、将当前系统登录用户的信息转换为大写后保存至/tmp/who.out文件中


Linux bash中I/O重定向及管道_重定向_02

3、一个linux用户给root发邮件,要求邮件标题为”help”,邮件正文如下:

Hello, I am 用户名,the system version is here,pleasehelp me to check it ,thanks!

操作系统版本信息


Linux bash中I/O重定向及管道_重定向_03

Linux bash中I/O重定向及管道_管道_04

4、将/root/下文件列表,显示成一行,并文件名之间用空格隔开


Linux bash中I/O重定向及管道_重定向_05

5、file1文件的内容为:”1 2 3 4 5 6 7 8 9 10” 计算出所有数字的总和

Linux bash中I/O重定向及管道_重定向_06

Linux bash中I/O重定向及管道_管道_07



6、处理字符串“xt.,l 1 jr#!$mn2 c*/fe3 uz4”,只保留其中的数字和空格

7、将PATH变量每个目录显示在独立的一行

Linux bash中I/O重定向及管道_重定向_08

8、删除指定文件的空行

Linux bash中I/O重定向及管道_管道_09

9、将文件中每个单词(字母)显示在独立的一行,并无空行

Linux bash中I/O重定向及管道_重定向_10