Chinaunix首页 | 论坛 | 博客
  • 博客访问: 1159160
  • 博文数量: 221
  • 博客积分: 10152
  • 博客等级: 上将
  • 技术积分: 1518
  • 用 户 组: 普通用户
  • 注册时间: 2005-07-22 10:42
文章分类

全部博文(221)

文章存档

2018年(1)

2015年(6)

2014年(3)

2013年(4)

2012年(1)

2011年(5)

2010年(14)

2009年(10)

2008年(28)

2007年(33)

2006年(114)

2005年(2)

我的朋友

分类:

2006-09-07 17:07:14

详解重定向1>&2和2>&1 [转]

详解重定向1>&2和2>&1
 
大 家在刚开始学SHELL的时候,可能对1>&2和2>&1,&2,是什么意思可能不是很清楚,下面的文章希望对大家 有帮助说到 I/O redirection ,让我们先来认识一下 File Descriptor (FD file descriptor)。 
在 shell 程式中,最常使用的 FD 大概有三個,分別為: 
0: Standard Input (STDIN) 
1: Standard Output (STDOUT) 
2: Standard Error Output (STDERR) 
在標準情況下,這些 FD 分別跟如下設備(device)關聯: 
stdin(0): keyboard 
stdout(1): monitor 
stderr(2): monitor 
* 1>;  * 2>; 前者是改變 stdout 的數據輸出通道,後者是改變 stderr 的數據輸出通道。 兩者都是將原本要送出到  monitor 的數據轉向輸出到指定檔案去。 由於 1 是 >; 的預設值,因此,1>; 與 >; 是相同的,都是改  stdout 。 
用上次的 ls 例子來說明一下好了:
$ ls my.file no.such.file 1>;file.out 
ls: no.such.file: No such file or directory 
這樣 monitor 就只剩下 stderr 而已。因為 stdout 給寫進 file.out 去了。
$ ls my.file no.such.file 2>;file.err 
my.file 
這樣 monitor 就只剩下 stdout ,因為 stderr 寫進了 file.err 。
$ ls my.file no.such.file 1>;file.out 2>;file.err 
這樣 monitor 就啥也沒有,因為 stdout 與 stderr 都給轉到檔案去了... 
呵~~~ 看來要理解 >; 一點也不難啦﹗是不?沒騙你吧? ^_^ 不過,有些地方還是要注意一下的。 
首先,是 file locking 的問題。比方如下這個例子:
$ ls my.file no.such.file 1>;file.both 2>;file.both 
從 file system  的角度來說,單一檔案在單一時間內,只能被單一的 FD 作寫入。 假如 stdout(1) 與 stderr(2) 都同時在寫入  file.both 的話, 則要看它們在寫入時否碰到同時競爭的情形了,基本上是"先搶先贏"的原則。 讓我們用周星馳式的"慢鏡頭"來看一下  stdout 與 stderr 同時寫入 file.out 的情形好了: 
* 第 1, 2, 3 秒為 stdout 寫入 * 第 3, 4, 5 秒為 stderr 寫入 
那 麼,這時候 stderr 的第 3 秒所寫的數據就丟失掉了﹗ 要是我們能控制 stderr 必須等 stdout 寫完再寫,或倒過來, stdout 等 stderr 寫完再寫,那問題就能解決。 但從技術上,較難掌控的,尤其是 FD 在作"長期性"的寫入時... 那,如何解決呢?
所謂山不轉路轉、路不轉人轉嘛, 我們可以換一個思維:將 stderr 導進 stdout 或將 stdout 導進 sterr ,而不是大家在搶同一份檔案,不就行了﹗ 
bingo﹗就是這樣啦: * 2>;&1 就是將 stderr 併進 stdout 作輸出 * 1>;&2 或 >;&2 就是將 stdout 併進 stderr 作輸出 
於是,前面的錯誤操作可以改為:
$ ls my.file no.such.file 1>;file.both 2>;&1 
或 
$ ls my.file no.such.file 2>;file.both >;&2 
阅读(839) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~