##1.理解输出 输出有两种:一种是显示到屏幕,一种是输出到文件。之前的很多例子都是直接显示到屏幕上的,屏幕关了就没了,要是能够将运行结果存在文件中,能有很多作用 ####1.关于标准文件描述符
文件描述符 | 缩写 | 描述 |
---|---|---|
0 | STDIN | 标准输入 |
1 | STDOUT | 标准输出 |
2 | STDERR | 标准错误 |
- 关于STDIN,通过<重定向能指定接受来自另一个文件的输入
- 关于STDOUT,在Linux中标准输出就是显示器,结果默认显示在显示器中,可以用重定向符号>来指定结果输出的位置(也可以用>>来将结果添加到某个文件中)
- 关于STDERR,在Linux中正常输出和错误输出是分开的,默认情况下ERR是定向到OUT的,错误输出比正常输出有更高的优先级。
ls -al badfile 2> text4 #将错误输出,输出到text4中,这样屏幕上就看不见报错了(掩耳盗铃)
#
ls -al test test2 test3 badtest 2> text6 1> text7 # 2>,代表错误输出的去向,1>,代表正常输出的去向(实现的输出的分离)
#
ls -al test test2 test3 badtest &> text8 # &> ,代表正常、错误输出同时去同一个文件(错误信息会在前面,因为有更高的优先级)
####2.在脚本中实现重定向
- 临时重定向
cat test8
#!/bin/bash
#
echo "This is an error" >&2 #将这则信息输出到STDERR
echo "This is normal output"
#
#
#运行
./test8 2>text9
#输出
This is normal output #而第一行This is an error则去了2(STDERR)的text9
- 永久重定向 (exec命令)
cat test10
#!/bin/bash
#
exec 1>textout #利用exec可以将1(STDOUT)的默认输出从屏幕重定向到某个文件
echo "This is a test of redirecting all output"
echo "from a script to another file"
echo "without having to redirect every individual line"
#
#运行
./test10
#结果没有显示在屏幕中,但cat textout,可以发现输出都到这个文件中了
- 重定向后要将输出重定向回来就需要一定的技巧了,说白了要再用一个文件描述符,而Linux也支持用户自己建立文件描述符
#!/bin/bash
#
exec 3>text13 #创建文件描述符3,理论上3~8都可以(那么9去哪里了呢?)
#
echo "This should display on the monitor"
echo "and this should be stored in the file" >&3 #这行的输出重定向到3
echo "Then this should be back on the monitor"
#
####3.在脚本中重定向输入
exec 0< text #将text的内容当作输入
#
#一个关于读取文件的有趣例子
#
#!/bin/bash
#
count=1
exec 0< text
while read line
do
echo "Line $count: $line"
count=$[ $count + 1 ]
done
echo "Finished processing the file"
#这个脚本和第十四章的某个脚本功能相同,但用的代码不一样,第十四章利用了cat和油管,这里直接用了exec
- exec 6 <&0 可以先将输入的描述符保存到一个自定义的描述符中,用完以后再换回来
- exec 3<>text 可以在同一个文件中对数据进行读写。但是任何读写都会从文件指针上次的位置开始。不够小心的话,输入的文件可能覆盖原有的文件。
####4.关闭文件描述符
- shell会在脚本退出时关闭他们,但有时需要自己动手
- exec 3>&- 这样就关闭了文件描述符
- 但关闭后又打开,新的输出会覆盖旧的输出
####5.记录消息(tee) 很多时候,我们会希望输出能同时显示在显示器和文件中,这时候就要用到tee了
- 默认情况下,tee在每次使用时会覆盖前面的输出内容,如果要追加的话,要添加 -a
#终端中输入:
who | tee text
#输出
yiwen 什么的
#输入
date | tee -a text
#输出
Sun什么的
#输入
cat text
#输出
yiwen 什么的
Sun什么的
####6.其他(阻止输出、临时文件、临时目录等)
- 要阻止输出的话,直接将输出重定向到 /dev/null上,重定向到这个中间中的数据会被直接删掉
- 临时文件的内容都和/temp有关,参见原书P324,这里不详述了
第十五章后面有个实例,但我没有成功,代码报错说模糊的重定向,有点小问题,这个等我解决了再说吧