重定向应该是Linux下最常用的操作了,之前只是知道怎么用,但原理了解不详细,在此总结一下。
重定向的例子[1]:ls -l > hold.txt //将输出重定向到hold.txt
ls -l >> hold.txt //将输出附加到hold.txt尾部
标准错误重定向[2]
文件描述符 :是程序发送输出和获取输入的地方(句柄)。
程序默认会打开三个描述符: 0 标准输入;1 标准输出;2 标准错误。
command >hold.txt 2>&1 &
command >hold.txt 是将command的输出重定向到hold.txt文件,即输出内容不打印到屏幕上,而是输出到hold.txt文件中,重定向符号 “>” 默认是1(标准输出),因此使用 “>” 替代 “1>” 。 2>&1 是将标准出错重定向到标准输出,这里的标准输出已经重定向到了hold.txt文件,即将标准出错也输出到hold.txt文件中。最后一个& , 是让该命令在后台执行。
试想2>1代表什么?
2与>结合代表错误重定向,而1则代表错误重定向到一个文件1,而不代表标准输出;换成2>&1,&与1结合就代表标准输出了,就变成错误重定向到标准输出。
为何2>&1要写在后面?
首先是command > hold.txt 将标准输出重定向到hold.txt中, 2>&1 是标准错误拷贝了标准输出的行为,也就是同样被重定向到hold.txt中,最终结果就是标准输出和错误都被重定向到hold.txt中。如果命令是:command 2>&1 >hold.txt 那么,2>&1 标准错误拷贝了标准输出的行为,但此时标准输出还是在终端。>hold.txt 后输出才被重定向到hold.txt,但标准错误仍然保持在终端,就hold不住了。
合并标准输出和标准错误 [3]
符号“&>”把标准出和标准错误重定向到同一个文件。符号“>&”在tcsh中实现相同的功能。
例子:
touch aa bb
echo 'This is bb' >bb
cat bb cc &>aa
cat bb dd >&aa //测试发现在bash下,这句也是可以的
附:查看shell类型
1, echo $0 系统默认的shell,并不一定是当前的shell
2, echo $SHELL 同1
3, ps 查看正在运行的shell
参考文献:
[1]Linux程序设计[M].Neil Matthew & Richard Stones
[2]http://www.linuxde.net/2011/11/1959.html
[3]Linux命令,编辑器于shell编程[M].Mark G. Sobell