I/O重定向 详解及例子! (ZT)
上一篇 / 下一篇 2009-01-15 15:16:24 / 个人分类:Linux
下文对学习Shell programming 非常重要51Testing软件测试网"r+l0W8N3l'a
51Testing软件测试网#A5eL0ri+{1、基本概念51Testing软件测试网q
P(A bbB-F
a、I/O重定向通常与 FD有关,shell的FD通常为10个,即 0~9;51Testing软件测试网oFN3z)L5{#@
b、常用FD有3个,为0(stdin,标准输入)、1(stdout,标准输出)、2(stderr,标准错误输出),默认与keyboard、monitor、monitor有关;
T*f~-k;d.nbdo0 c、用 < 来改变读进的数据信道(stdin),使之从指定的档案读进;
0Z.d4};MO0 d、用 > 来改变送出的数据信道(stdout, stderr),使之输出到指定的档案;51Testing软件测试网![cvb|T'M4C3`
e、0 是 < 的默认值,因此 < 与 0<是一样的;同理,> 与 1> 是一样的;51Testing软件测试网q,L+YU*\ qbw @
f、在IO重定向 中,stdout 与 stderr 的管道会先准备好,才会从 stdin 读进资料;51Testing软件测试网H2{7{F8yh;f9l;C
g、管道“|”(pipe line):上一个命令的 stdout 接到下一个命令的 stdin;
E-eT;B;U q)f{|0 h、tee 命令是在不影响原本 I/O 的情况下,将 stdout 复制一份到档案去;51Testing软件测试网6I6K4FXr
i、bash(ksh)执行命令的过程:分析命令-变量求值-命令替代(``和$( ))-重定向-通配符展开-确定路径-执行命令;51Testing软件测试网 ^(fpF ]#q0Fa
j、( ) 将 command group 置于 sub-shell 去执行,也称 nested sub-shell,它有一点非常重要的特性是:继承父shell的Standard input, output, and error plus any other open file descrīptors。
,KN ps-D:v*s&M _'H0 k、exec 命令:常用来替代当前 shell 并重新启动一个 shell,换句话说,并没有启动子 shell。使用这一命令时任何现有环境都将会被清除,。exec 在对文件描述符进行操作的时候,也只有在这时,exec 不会覆盖你当前的 shell 环境。51Testing软件测试网q.^TEov
51Testing软件测试网Vu:q%It.nxV
X!}hlj02、基本IO
)_Q!@B(p|
D5Vr!mb0 cmd > file 把 stdout 重定向到 file 文件中51Testing软件测试网}2B{i RNC0F2I
cmd >> file 把 stdout 重定向到 file 文件中(追加)
x;gGT:X6yE7B
oyx0 cmd 1> fiel 把 stdout 重定向到 file 文件中
S,R7}OSP0 cmd > file 2>&1 把 stdout 和 stderr 一起重定向到 file 文件中51Testing软件测试网dOu0Y |D?"c1f
cmd 2> file 把 stderr 重定向到 file 文件中51Testing软件测试网b^qPKr1?
cmd 2>> file 把 stderr 重定向到 file 文件中(追加)51Testing软件测试网_-Q-aK:zm6sr
cmd >> file 2>&1 把 stderr 和 stderr 一起重定向到 file 文件中51Testing软件测试网G'JFv9PoAk%F
h
cmd < file >file2 cmd 命令以 file 文件作为 stdin,以 file2 文件作为 stdout
+Q y;n|*QE7o/@0 cat <>file 以读写的方式打开 file
c%x8{
wt`-Ae0 cmd < file cmd 命令以 file 文件作为 stdin
:S|7x6A
` Ry)Z0 cmd << delimiter Here document,从 stdin 中读入,直至遇到delimiter 分界符51Testing软件测试网.w.J}G["_Mu
"V&V:qH*_8Ql D051Testing软件测试网'L&ss.b{@
3、进阶IO51Testing软件测试网\I,I;o(~!R&H
>&n 使用系统调用 dup (2) 复制文件描述符 n 并把结果用作标准输出
.C#JWhfK0 <&n 标准输入复制自文件描述符 n
#j/k0Z;W]5\!go0 <&- 关闭标准输入(键盘)51Testing软件测试网5O8MV,{MlR'{g
>&- 关闭标准输出51Testing软件测试网O(H
O1f#[N"i
n<&- 表示将 n 号输入关闭
ug&{^xHf3nL X0 n>&- 表示将 n 号输出关闭51Testing软件测试网[4f`8M C
上述所有形式都可以前导一个数字,此时建立的文件描述符由这个数字指定而不是缺省的 0 或 1。如:
+e5X5X,Shi0 ... 2>file 运行一个命令并把错误输出(文件描述符 2)定向到 file。
McH4u7l*W(C2UU4f0 ... 2>&1 运行一个命令并把它的标准输出和输出合并。(严格的说是通过复制文件描述符 1 来建立文件描述符 2 ,但效果通常是合并了两个流。)
B)l?6CJ _0
aN
Pkbs0 2>&1说明:2>&1 也就是 FD2=FD1 ,这里并不是说FD2 的值 等于FD1的值,因为 > 是改变送出的数据信道,通俗的说是:把stderr并到stdout。
lQr ny0 但使用类似 cmd 1>&3 这样的形式时,原理相同,但往往不同于 2>&1 和 1>&2 通常用来合并的作用。
K'rt8V0v6Jk&B0 51Testing软件测试网$L+Jg![ikO
注意:普通cmd命令的cmd n>&n 和exec n>&n 是有区别的。51Testing软件测试网.X.MTu+J6_cvbN;D7Y*M
a-s(\0Ge;N0c+y-tR?z0 exec 0<infilename # 打开文件infilename作为 stdin
q;AL C*X(Br0 exec 1>outfilename # 打开文件outfilename作为stdout
0|3P [:`_'H:[0 exec 2>errfilename # 打开文件 errfilename作为 stderr
__:l)Y-C0 exec 0<&- # 关闭 FD051Testing软件测试网&Y;AS&o:z_%tlz.o
exec 1>&- # 关闭 FD151Testing软件测试网zM?;SE5s!we
exec 5>&- # 关闭 FD551Testing软件测试网6dPgrf:M%fYkP
51Testing软件测试网D"dL+{;~f
问:
+d.l p3ugbu0如果关闭了 FD0、FD1、FD2,其后果是什么?