2016-12-02 50 views
0

是否有可能在一個bash腳本中,使除echo輸出我輸出的所有輸出到日誌文件,但如果有錯誤輸出它應該顯示在終端(和日誌文件也是課程)?Bash - 發送所有輸出到一個日誌文件,但顯示錯誤

+0

你能確認你想要這3種輸出嗎? 1)你的回聲應該只出現在控制檯上,2)其他標準輸出應該只出現在日誌文件和3)錯誤輸出應該出現在控制檯和日誌文件都 – Aaron

+0

是完全相同亞倫 –

+0

所以,你想從'只輸出echo「出現在stdout上?那麼'printf'呢? – anubhava

回答

0

UNIX終端通常提供兩個輸出文件描述符,stdoutstderr,默認情況下它們都會進入終端。

乖程序發送自己的「標準」輸出到stdout,並錯誤stderr。因此,例如echo寫入標準輸出。 grep將匹配行寫入stdout,但如果出現錯誤,例如無法讀取文件,則錯誤將發生到stderr

您可以用>(對於stdout)和2>(對於stderr)重定向。所以:

myscript >log 2>errors 

將輸出寫入log和錯誤errors

command >log 

...錯誤會繼續去終端,通過標準輸出:

所以你的要求的一部分,可以用簡單的滿足。

您的額外要求是「除了我特別用echo輸出的輸出」。

這或許對你來說足夠你echo一起去到stderr:

echo "Processing next part" >&2 

>&2重定向stdout從這個命令stderr。這是在shell腳本中輸出錯誤(有時是信息輸出)的標準方式。

如果您需要的不僅僅是這一點,您可能想用更多的文件描述符來做更復雜的事情。請嘗試:https://unix.stackexchange.com/questions/18899/when-would-you-use-an-additional-file-descriptor

行爲良好的UNIX程序往往避免使用額外的文件描述符執行復雜的事情。約定將自己限制爲stdoutstderr,並在命令行參數中將任何其他輸出指定爲文件名。

+0

一個小小的挑剔......這不是UNIX終端,提供標準輸入,標準輸出,和標準錯誤。即使未在終端運行的進程必須在啓動這三個文件描述符(重要的區別,因爲許多守護進程剛剛關閉所有三個第一件事)。這是真正的UNIX進程模型只是一個功能...我想你甚至可以把它叫做API的一部分... – twalberg

1

這裏是你可以使用一個額外的文件描述符做什麼:

#!/bin/bash 

# open fd=3 redirecting to 1 (stdout) 
exec 3>&1 

# redirect stdout/stderr to a file but show stderr on terminal 
exec >file.log 2> >(tee >(cat >&3)) 

# function echo to show echo output on terminal 
echo() { 
    # call actual echo command and redirect output to fd=3 
    command echo "[email protected]" >&3 
} 

# script starts here 
echo "show me" 
printf "=====================\n" 
printf "%s\n" "hide me" 
ls foo-foo 
date 
tty 
echo "end of run" 

# close fd=3 
exec 3>&- 

你運行你的腳本後,它會顯示以下的終端:

show me 
ls: cannot access 'foo-foo': No such file or directory 
end of run 

如果你這樣做cat file.log話,就說明:

===================== 
hide me 
ls: cannot access 'foo-foo': No such file or directory 
Fri Dec 2 14:20:47 EST 2016 
/dev/ttys002 
  • 在TE我們只得到echo命令的輸出和所有的錯誤。
  • 在日誌文件中我們得到的錯誤,從腳本輸出剩餘。
相關問題