标准输入输出重定向
程序會(huì)在運(yùn)行中輸出日志,并是通過java的日志類進(jìn)行輸出的。而如果關(guān)掉SSH運(yùn)行程序,就會(huì)丟失這些信息。直觀的解決辦法是將輸出到控制臺(tái)的日志重定向到文件中,于是我將命令改為:sh auto.sh > console.txt &。不過事實(shí)并沒像我想的那樣,console.txt雖然被創(chuàng)建了,而日志并沒有寫在其中。后來請(qǐng)教Robert Chen,他讓我用sh auto.sh >console.txt 2>&1 & 命令試一下,我輸入了這個(gè)隱晦的命令之后,原本輸出到控制臺(tái)的日志內(nèi)容終于被重定向到console.txt了。
下面來詳細(xì)分析一下這條命令:
sh auto.sh 運(yùn)行shell腳本
>console.txt 將標(biāo)準(zhǔn)輸出重定向到console.txt文件中
其實(shí)操作系統(tǒng)有三個(gè)常用的流:
0:標(biāo)準(zhǔn)輸入流 stdin
1:標(biāo)準(zhǔn)輸出流 stdout
2:標(biāo)準(zhǔn)錯(cuò)誤流 stderr
一般當(dāng)我們用 > console.txt,實(shí)際是 1>console.txt的省略用法;< console.txt ,實(shí)際是 0 < console.txt的省略用法。
java的日志類默認(rèn)是輸出到system.err中,所以要想將日志內(nèi)容重定向到console.txt,需要將stderr重定向到console.txt.
將stderr重定向到console.txt的命令是 2 < console.txt。
不過有個(gè)問題,stdout是有緩沖的,而stderr是沒有緩沖的,原因很簡單,stderr一般是系統(tǒng)發(fā)生錯(cuò)誤,比如編譯一個(gè)程序出錯(cuò),需要立即給出編譯錯(cuò)誤提示。
所以如果寫成 sh auto.sh > console.txt 2 > console.txt就會(huì)出現(xiàn)問題。
再來看看 >& 操作符:
| 重定向操作符 | 描述 |
| > | 將命令輸出寫入到文件或設(shè)備(如打印機(jī)),而不是命令提示符窗口或句柄。 |
| < | 從文件而不是從鍵盤或句柄讀入命令輸入。 |
| >> | 將命令輸出添加到文件末尾而不刪除文件中已有的信息。 |
| >& | 將一個(gè)句柄的輸出寫入到另一個(gè)句柄的輸入中。 |
| <& | 從一個(gè)句柄讀取輸入并將其寫入到另一個(gè)句柄輸出中。 |
| | | 從一個(gè)命令中讀取輸出并將其寫入另一個(gè)命令的輸入中。也稱作管道。 |
而句柄的定義就是:
| 句柄 | 句柄的數(shù)字代號(hào) | 描述 |
| STDIN | 0 | 鍵盤輸入 |
| STDOUT | 1 | 輸出到命令提示符窗口 |
| STDERR | 2 | 錯(cuò)誤輸出到命令提示符窗口 |
| UNDEFINED | 3-9 | 句柄由應(yīng)用程序單獨(dú)定義,它們是各個(gè)工具特有的 |
所以 2 >& 1就是把 stderr重定向到stdout 由于stdout被重定向到 console.txt,所以最終stderr,stdout均被重定向到console.txt并且解決了兩者緩沖區(qū)不一致的問題。
java?Test>test.txt?2>&1
轉(zhuǎn)載:http://www.cnblogs.com/coolgestar02/archive/2011/01/04/1925590.html
轉(zhuǎn)載于:https://www.cnblogs.com/gaol/p/4666714.html
總結(jié)
- 上一篇: 状态机模型
- 下一篇: C标准时间与时间戳的相互转换