redirection无难事

昨天想了大半夜,终于想明白了redirection是怎么回事。以前遇到redirection总是靠记忆,什么2>&1啊,还总是记乱了,又得回过回来看man page.
昨天得到apue的提示,终于想明白了redirection.再也不用记了。理解才是王道。

最难理解的就是
cmd >outfile 2>&1

cmd 2>&1 >outfile
这两个了,只要这两个理解清楚了,那么redirection无难事。
首先说一下file table,linux 的file table只有i-node而没有v-node,process 将fd指向file table,而在两个fd同时open同一文件时,也即fd指向同一i-node,这时候产生了file-sharing,他们共享一个file table.

下面就用图来解释
cmd >outfile 2>&1
前面cmd >outfile将cmd产生的stdout,也即fd=1 redirect 到outfile.这时候fd=1指向了outfile的file table. (stdout原来是指向terminal的)
如图:
接着2>&1这一段又将fd=2也即stderr指向fd=1(也即stdout)所指向的filetable.就是将stdout discriptor file table dup 到 stderr.
如图:
这时候stderr也指向了outfile 的file table.所以综合起来,cmd产生的stderr 和stdout都redirect 到了outfile.

同理对于
cmd 2>&1 >outfile
由于shell本来打开了fd=1,也就是fd=1是指向terminal file table的。前面一段2>&1就将fd=2(stderr)也指向了terminal file table.也就是把stdout dup 到了stderr.
如图:
接着">outfile"这段,其实是"1>file",把1省略了,这里把fd=1(stdout)指向了outfile的file table,
而fd=2刚才被指向了terminal 的file table.现在还是不会变。
如图:
综合起来就是把stderr 定向到了终端,把stdout定向到了outfile.


其实道理很简单,就是一个文件的指向问题,也不必太深入地理解dup(),以及process table,file table的具体实现。当然能理解最好。

水平有限,理解的不对的地方请指正。

PS:图真是不好画啊,几个图画了我一早上。

你可能感兴趣的:(redirect)