Linux重定向

重定向应该是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

原文地址:https://www.cnblogs.com/realwall/p/2277849.html