我有一個具體的問題,我想解決,我跑system
通過perl
我認爲在運行bash
:日誌輸出和錯誤單獨和共同同時
- 顯示在
both.log
stdout
和stderr
。如果完成,請添加「完成」。 - 追加
stderr
在stderr.log
- 不要打印出來給終端,除了原有的命令和「完成」如果命令完成。
所以,一旦我們結合stdout
和stderr
,我們可以再次分開它們嗎?或者我們可以先捕獲stderr
,然後將它與stdout
結合後?
我有一個具體的問題,我想解決,我跑system
通過perl
我認爲在運行bash
:日誌輸出和錯誤單獨和共同同時
both.log
stdout
和stderr
。如果完成,請添加「完成」。stderr
在stderr.log
所以,一旦我們結合stdout
和stderr
,我們可以再次分開它們嗎?或者我們可以先捕獲stderr
,然後將它與stdout
結合後?
慶典:system("((" . $cmd . " 2>&1 1>&3 | tee -a stderr.log) 3>&1) > both.log; echo done | tee -a both.log"
即使我們使用tee
爲stderr.log
它不tee
錯誤輸出到終端(這是我想要的)。我不完全理解它是如何工作的,但我猜想tee
會導致它轉到日誌文件並轉到下一個文件描述符公式。
獎金
我在評論中發現了這個位置:http://wiki.bash-hackers.org/howto/redirection_tutorial 這可以用來做同樣的事情,但所有的輸出也tee
d到終端(它不打印「完成「)。
慶典: (($command 2>&1 1>&3 | tee stderr.log) 3>&1) | tee both.log
使用Perl 5.14.1。
tcsh
單獨在這裏是不夠的。它不支持在沒有標準輸出的情況下重定向stderr。
使用另一個shell或指定的腳本。
更多here。
UPDATE:
這能移植到TCSH?
否tcsh不支持不使用stdout重定向標準錯誤。
我也可以訪問bash和zsh,但他們不是首選。更新問題。 – Stuart
已更新的答案。 – shx2
因爲我通過'perl'調用'system'並且我相信它正在使用'bash',所以從問題中刪除'tcsh'。也明顯地修改了這個問題,因爲我不再需要'tee'。 – Stuart