输入重定向
- stdin,文件描述符是0, <
- 默认的输入就是你的键盘输入
- 输入重定向的意思就是把默认从键盘的输入数据,改为从文件中,或从其它命令中获得。
来看例子:
tr a-z A-Z // 此时你回车后,tr命令等待你的输入,你可以输入小写字母,会转换为大写的
// 那么如果我们想要把一个文件中的小写字母都转为大写的呢? 此时输入重定向的作用就来了
tr a-z A-Z < a.txt
[root@rhel8-mytest ~]# tr a-z A-Z <<EOF // 用于多行,一般用EOF作为结束符
> aa
> bb
> cc
> EOF
[root@rhel8-mytest ~]# tr a-z A-Z < a.txt > a2.txt
[root@rhel8-mytest ~]#
[root@rhel8-mytest ~]#
[root@rhel8-mytest ~]# cat a2.txt
AAA
AAA
BBB
BBB
CCC
练习:把 /etc/passwd 数据输入给 wc 命令,统计文件中的内容行数?
wc -l < /etc/passwd
// 注意:对比一下上面的结果,和下面的结果,有什么不同?
wc -l /etc/passwd
可以发现,上面的输入重定向,是没有打印文件名称的,为什么?
因为你输入重定向相当于把文件的内容作为数据流传给了wc命令,此时你的数据流只是数据本身,并没有文件数据。
输出重定向
- 又分为 标准输出(stdout,文件描述符1,>, >> ),标准错误输出(stderr,文件描述符2,2>, 2>>)
- 同时,写入到文件又分为覆盖式,或追加式。
- 默认输出到终端。
- 把要输出到终端的数据写入到指定文件中。
touch file
ls -l file // 会输出文件信息
ls -l file2 // 文件不存在,会输出错误信息
ls: cannot access xxxxxx: No such file or directory // 这种其实就是错误输出了
练习:将 man bash 命令打印到终端的内容,写入到文件 readme.txt 中 ?
man bash > readme.txt
覆盖式写入
echo 123 > readme.txt
echo 456 > readme.txt // 猜猜readme.txt文件内容是什么?
追加式写入
echo 789 >> readme.txt // 再猜猜readme.txt文件的内容是什么?
标准输出和标准错误输出区别:
ll a.txt > /tmp/stderr.txt // a.txt是存在的,因此这行命令执行,是没有输出的,因为输出被重定向到了 stderr.txt 文件中
ll a.txt 2> /tmp/stderr.txt // 终端输出了正常的文件信息,然后将输出到终端的错误重定向到 stderr.txt 文件中,但是因为此时是没有错误输出的,所以可以猜猜此时 stderr.txt 的内容是什么?
ll a2.txt 2> /tmp/stderr.txt // a2.txt文件不存在,此时会报错,此时会把错误信息重定向到 stderr.txt 文件中
如果我们想把正常输出 和 错误输出,追加式的写入同一个文件呢?
ls -l a.txt &>> readme.txt
ls -l a2.txt &>> readme.txt // 猜猜看,最终的内容是什么?
如果我们想在一个命令的执行中,将正常输入和错误输出分别覆盖式写入不同文件呢?
ll a.txt a3.txt >> log.txt 2>> err.txt