是否有可能在一個bash腳本中,使除echo輸出我輸出的所有輸出到日誌文件,但如果有錯誤輸出它應該顯示在終端(和日誌文件也是課程)?Bash - 發送所有輸出到一個日誌文件,但顯示錯誤
回答
UNIX終端通常提供兩個輸出文件描述符,stdout
和stderr
,默認情況下它們都會進入終端。
乖程序發送自己的「標準」輸出到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程序往往避免使用額外的文件描述符執行復雜的事情。約定將自己限制爲stdout
和stderr
,並在命令行參數中將任何其他輸出指定爲文件名。
一個小小的挑剔......這不是UNIX終端,提供標準輸入,標準輸出,和標準錯誤。即使未在終端運行的進程必須在啓動這三個文件描述符(重要的區別,因爲許多守護進程剛剛關閉所有三個第一件事)。這是真正的UNIX進程模型只是一個功能...我想你甚至可以把它叫做API的一部分... – twalberg
這裏是你可以使用一個額外的文件描述符做什麼:
#!/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
命令的輸出和所有的錯誤。 - 在日誌文件中我們得到的錯誤,從腳本輸出剩餘。
- 1. 將bash stderr發送到日誌文件,但前提是存在錯誤
- 2. 發送日誌錯誤到一個文件
- 3. 將nohup的輸出錯誤發送到系統日誌
- 4. 發送所有消息到一個日誌文件,並且RavenDB登錄到另一個日誌文件
- 5. 向終端和文件日誌發送回顯和錯誤
- 6. 輸出到日誌文件是如下所示不正確地在bash
- 7. Eclipse控制檯沒有顯示任何錯誤/日誌輸出
- 8. 如何pprint模塊的輸出發送到一個日誌文件
- 9. 的Process.Start - 無法輸出發送到日誌文件
- 10. 將日誌輸出發送到grails中的不同文件1.3.2
- 11. 將put的輸出同時發送到日誌文件和stdout?
- 12. 輸出到幾個日誌文件? (Unity3D)
- 13. 如何將java -jar錯誤輸出到文本/日誌文件?
- 14. 蟒蛇:日誌發送到標準輸出日誌
- 15. 時間命令的輸出保存到一個日誌文件
- 16. 將錯誤發送到另一個日誌 - Ruby on rails
- 17. start-Transcript不會捕獲所有輸出到日誌文件..?
- 18. git日誌文件在哪裏?即錯誤日誌,輸出日誌等
- 19. 未記錄到輸出日誌文件中的錯誤
- 20. Jenkins控制檯輸出有一個日誌權限錯誤
- 21. 我可以回顯錯誤消息並將其發送到日誌文件中?
- 22. Bash輸出到不同的屏幕和日誌文件
- 23. bash直接輸出到日誌文件除了stdout
- 24. Bash輸出所有標準輸出到控制檯和文件
- 25. Rhomobile發送日誌文件
- 26. CodenameOne發送日誌文件
- 27. Git日誌輸出日誌文件
- 28. C程序顯示沒有錯誤,但不顯示輸出
- 29. Heroku日誌顯示沒有錯誤,但我的大部分網址都顯示「很抱歉,但出錯了。」
- 30. logstash發送日誌文件到redis
你能確認你想要這3種輸出嗎? 1)你的回聲應該只出現在控制檯上,2)其他標準輸出應該只出現在日誌文件和3)錯誤輸出應該出現在控制檯和日誌文件都 – Aaron
是完全相同亞倫 –
所以,你想從'只輸出echo「出現在stdout上?那麼'printf'呢? – anubhava