script如何導出stderr - Linux

Table of Contents

我想將stderr的訊息額外導到檔案,
也就是說error訊息除了輸出到螢幕之外
,還要輸出到檔案。

如果是stdout的話,可以使用tee來達成,
但stderr要怎麼做呢?

--

All Comments

Donna avatarDonna2011-10-31
2>tee
啊, 好像不太對 ...
Franklin avatarFranklin2011-10-31
如果可以接受stderr和stdout同一檔案,那就是 2>&1 再 |
Callum avatarCallum2011-11-02
myprogram 2>&1 | tee output-file
如果不行,那就要效法上次網友貼的 gdb 大法
Vanessa avatarVanessa2011-11-07
上一行的不行,是指不能接受 out err 同一檔案
Mia avatarMia2011-11-10
剛才想到,不用 gdb 也可以做
James avatarJames2011-11-10
myprogram 2>output-file ; tail -f output-file
Jessica avatarJessica2011-11-11
f(){ echo 1>&3; ls abc 2>&1; }; f 3>&2 把stdin/err對調
Dorothy avatarDorothy2011-11-12
ls exist nonexist 3>&1 1>&2 2>&3 同上,接下來可用tee
Aaliyah avatarAaliyah2011-11-14
b大的方法不合我用,順序應該會不對
k大的方法,我要試試能不能用
Harry avatarHarry2011-11-14
所謂順序不對是什麼意思?
Ivy avatarIvy2011-11-16
我猜是tail會漏掉一些快速印出的較早內容.那就改一下
Caroline avatarCaroline2011-11-17
last的參數,讓它能印出所有一開始內容就好
Thomas avatarThomas2011-11-22
打錯, 是 tail 的參數
Olga avatarOlga2011-11-24
你的意思是如果只有警告,tail 不會結束,而你希望make完都
一律停止?
Bethany avatarBethany2011-11-27
警告是從stdout出來還是stderr? 如果是前者那簡單,如果是
Skylar Davis avatarSkylar Davis2011-12-01
從stderr(跟error訊息一起)出來,那就變成需要一個軟體
filter. 把 error 分離出來.
Frederic avatarFrederic2011-12-02
我懂了,看到你第一次編輯回言,警告也是從stderr出來.
那只有寫個軟體filter了.
Zanna avatarZanna2011-12-02
沒寫過filter,暫時不打算這麼做,先看看k大的方法行
不行
Dora avatarDora2011-12-06
k大的方法一樣是在OS層面處理,你的問題是Ap應用層面(把
所需的error訊息特別過濾出來),應該是一樣不行.
Madame avatarMadame2011-12-08
filter也沒什麼特別, a | b | c 的 b 就叫 filter
你把error/warning的文字範例提供一下,說不定馬上有人可以
George avatarGeorge2011-12-10
用 grep/sed/awk 等工具立刻組一個給你
Donna avatarDonna2011-12-10
可是你前面不是說警告也走 stderr 出來?還是我誤解了?
Aaliyah avatarAaliyah2011-12-14
還是搞了半天,你只想把stdout, stderr 的內容照時間順序合
Noah avatarNoah2011-12-14
併顯示並且log? 如果真的是這樣,那解法不用這麼複雜.
Annie avatarAnnie2011-12-17
就用傳統的 2>&1 把 stdout dup 給 stderr 就好.
Olga avatarOlga2011-12-21
myprogram 2>&1 | tee output-file
Queena avatarQueena2011-12-23
上面的方法因為要在整個log中找error發生點
所以才會希望另外產生一個只存stderr訊息的檔案
Tracy avatarTracy2011-12-28
這樣可以方便找error的發生點
Heather avatarHeather2011-12-31
那就綜合各方法如下
rm err-file ; touch err-file
tail -f err-file &
myprogram 2>>err-file | tee out-file
Isla avatarIsla2012-01-05
cat out-file err-file > single-out-err-file
Yuri avatarYuri2012-01-08
如果你make時螢幕訊息不重要,那更簡單
myprogram > out-file 2>err-file
再用上述的 cat 命令合併就好了
Edward Lewis avatarEdward Lewis2012-01-12
上面的方法是我目前在用的(我只差把檔案合成一個)
Andrew avatarAndrew2012-01-15
問題是這樣合出來的log,順序不對
Harry avatarHarry2012-01-20
會沒辦法知道發生error時stdout輸出什麼
Una avatarUna2012-01-24
要順序對,要用我推文 17:01 的那個方法
Elizabeth avatarElizabeth2012-01-24
所以我理想中是產生一個正常順序的完整log(包括
stdout 和stderr),且有額外一份只存stderr的log
Hedwig avatarHedwig2012-01-25
然後假如make時間不會很久,平常先用一般方法產生err-file
發生錯誤時,立刻再執行一次 17:01那個方法,兩次來比對
Eden avatarEden2012-01-25
總之我試試看,先謝謝bitlife大力幫忙
Genevieve avatarGenevieve2012-01-30
你講的這個需求,如果 make 有支援 log4c (log4j的c版)才有
希望了.
不客氣,希望有用就好.
Bethany avatarBethany2012-02-01
我要編譯的是android....編一次大約要50分鐘XD
Delia avatarDelia2012-02-04
所以K大的方法,如果真的可以把stdout和err調換
配合tee應該可以做到
Liam avatarLiam2012-02-08
看來用程式把 error 以 pattern 來 grep/sed/awk 抓出來
比較有希望.
Oscar avatarOscar2012-02-12
把stdout,stderr 的descriptor互換,沒有改變什麼啊?
Wallis avatarWallis2012-02-12
現在的問題是只一次 make,你要一次產生單一時序輸出檔,又
有一個單純只有 stderr 的檔,那是基本上相斥的事.
Delia avatarDelia2012-02-15
tee可以把stdout的資料分流到stdou和檔案
Caitlin avatarCaitlin2012-02-20
事實上,我剛熊熊才想到 17:01 那行根本是脫褲子放X. XD
Olga avatarOlga2012-02-22
一般程式一開始 stdout 和 stderr 都只向終端機.
tee 只是讓你看畫面兼log至檔案.現在問題是stdout和stderr
Todd Johnson avatarTodd Johnson2012-02-23
一開始是一體的. 你要分開它們,就不能一起tee
Puput avatarPuput2012-02-24
因為stdout和stderr一開始是都指向tty/pty,所以你掉換還是
同一個東西,會tee到的內容還是一樣. XD
Ingrid avatarIngrid2012-02-26
了解...那你的意思是tee是抓不到stderr的資訊
即使我把fd的輸出換過來?
Audriana avatarAudriana2012-02-28
我想了一下. 是有可能... 因為 pipe 只針對 stdin/stdout
Carol avatarCarol2012-02-28
不過,再想一下,還是怪怪的. 只能等你試看看了.
整個麻煩就在於你同時需要合流和分流. 調換stdout/stderr
Edward Lewis avatarEdward Lewis2012-03-03
是會讓 tee 能從它自己的 stdin 取得 make 的 stdout (包
含error/warning,因為out/err有swap過)
Mia avatarMia2012-03-06
好啊,星期一時再試試看
Sandy avatarSandy2012-03-07
但是因為經過pipe,就分流了,所以我懷疑b.sh就算抓到全部內
容,時序也會亂掉.更何況我不確定b.sh是否能抓到全部的log
Frederic avatarFrederic2012-03-09
簡單講,只有(out,err)合流,才會保證有正確的時序
似乎很難一次做兩個相反目的的工作.
Jacky avatarJacky2012-03-12
你要不要貼一下wanring/error範例,用filter搞不好還容易些
Odelette avatarOdelette2012-03-13
這倒是個問題,就算順序亂掉了,我也不一定能發現
Leila avatarLeila2012-03-14
我17:01的那一行,在(out,err)合流的前提下,又不是脫X放X了
Lauren avatarLauren2012-03-18
真弄不出來的話,也只是照現在的清況繼續用而已
Sandy avatarSandy2012-03-21
那行確保out,err即使app的fd不同,但用同一個OS的內部fd
Adele avatarAdele2012-03-25
filter就再看看吧,老實說發生error的訊息會長什麼樣
我現在也不是很確定
Charlie avatarCharlie2012-03-26
那麼我建議你用 17:01 那行,確保時序一定正確.
Elma avatarElma2012-03-30
等你測試好了,再回篇新的(舊的這篇可能洗出畫面了),我也有
興趣知道結果.