通过内容过滤将输出重定向到文件是我们平日里的基本任务之一.当命令输出文本时,这些输出文本有可能是错误信息,也有可能是正常的输出信息.单靠查看输出的文本本身,我们没有办法区别哪些是正常的,哪些是错误的.不过可以通过文件描述符来解决这个问题.
文件描述符是与某个打开的文件或者数据流相关联的整数.文件描述符0,1,2是系统预留的.
0-----stdin(标准输入);
1-----stdout(标准输出);
2-----stderr(标准错误);
例子1
echo "测试" > test.txt
会将 测试
写入到文本test.txt中, 如果文件不存在就自动创建, 如果存在则将文本内容清空以后再写入.
例子2
echo "测试" >> test.txt
会将 测试
写入到文本test.txt中, 如果文件不存在就自动创建, 如果存在则将会将内容追加在原来的内容后面.
例子3 (错误重定向)
ls printf.sh aaa 2>> 2.txt 1>>1.txt
会将错误的内容输出到2.txt , 标准的输出会写入到1.txt中.
例子4(stderr转化为stdout)
cmd &> output.txt
例子5(终端不显示stderr或者stdout)
有的时候不想让终端显示错误的输出,那么只需要将错误的输出重定向到/dev/null中,
ls -ah printf.sh qqq 2>/dev/null
那么输出就只有: printf.sh
同理,如果只想显示错误的输出,那么命令如下:
ls -ah printf.sh qqq 1>/dev/null
例子6(既想在终端显示stdout,又想将内容保存在文本中)
这个操作可以使用管道(|) 来实现.
ls -ah length.sh aaa | tee -a 3.txt
备注: -a选项是将内容追加到3.txt中,不加-a,则是将原来的内容覆盖.
这个只会将stdout内容写入3.txt中,stderr不会写入
ls -ah length.sh aaa 2>&1 | tee -a 3.txt
备注: -a选项是将内容追加到3.txt中,不加-a,则是将原来的内容覆盖.
加上2>&1, 这个会将stdout和stderr内容都写入3.txt中