Linux shell I/O 重定向 简单示
代码:
- exec 9>&1
- comd1 2>&1 >&9 9>&- | comd2 9>&-
- exec 9>&-
复制代码
comd1和comd2代表任意的命令。 该脚本使comd1的错误输出通过管道作为comd2的输入,comd1的正常输出仍然保持。
exec 9>&1 #把fd1的指针复制到fd9,即dup(1,9),或者干脆理解为fd9=fd1 #注意,此时fd9和fd1同时指向一个文件。也可认为将fd1的指针保存在fd9中一份 comd1 2>&1 >&9 9>&- | comd2 9>&- #这一句比较麻烦 #首先shell创建一个pipe,然后分别folk两个subshell #看看第一个subshell做了什么? #首先每个subshell都精确拷贝一份父进程的fd表,即0,1,2和9都复制过来了 #然后将fd1指向pipe文件,此时fd9仍然保存着父进程中fd1的文件指针,如果父进程没有重定向的话,就是stdout #然后处理这段2>&1 >&9 9>&重定向命令。既 #fd2=fd1; fd1=fd9; fd9=null #结果是fd2指向fd1原先指向的pipe文件,fd1指向fd9指向的文件,即stdout,然后将fd9关闭,由于这时fd1和fd9同时指向同一个文件stdout,所以stdout并没有真正关闭,只是减少打开次数。 #最后subshell执行comd1命令,comd1要输出时取fd1中的指针,即stdout,输出错误时,取fd2中的指针,即pipe,这样comd2从pipe中只得到了comd1输出的错误信息。 #再看看第二个subshell做了什么? #同样精确拷贝一份父进程的fd表 #然后将fd0指向pipe文件。 #然后处理这段 9>&重定向命令。既关闭fd9。
exec 9>&- #回到父进程,关闭fd9 注: for example 一开始 fd1=stdout fd2=stderr fd9=stdout
有pipe后(subshell) fd1=pipe fd2=stderr fd9=stdout cmd1 2>&1 >&9 9>&− | cmd2 ... 等价于 fd2=fd1 (fd2=pipe) fd1=fd9 (fd1=stdout) fd9=null
|
转载于:https://blog.51cto.com/roland/721980