2013-07-31 97 views
2

是否有一個可分配給變量的文件名(即不是像&1這樣的魔術內置shell令牌),它會讓我重定向到stdout重定向到bash中的stdout

我最後想要做的是運行像這樣在cron腳本:

LOG=/tmp/some_file 
... 
some_command 2>&1 >> $LOG 
echo "blah" >> $LOG 
... 

便利,這讓我通過重定向到/dev/null後關閉日誌時的噪音我敢肯定,沒有什麼可能會失敗(或至少沒有我關心的東西!)而無需重寫整個腳本。是的,關閉日誌並不是最好的做法 - 但是一旦這個腳本正常工作,沒有什麼可以想象的出錯,並且不需要任何人不想讀取的兆字節日誌信息。
5年後意外失敗的情況下,仍然可以通過翻轉開關再次打開日誌。另一方面,在編寫和調試腳本時,它涉及從shell手動調用它,如果它只是將輸出轉儲到控制檯,那將是非常好的。這樣我就不需要手動登錄日誌文件tail

換句話說,我正在尋找的是類似/proc/self/fd/0的bash-talk,我可以指定給LOG。碰巧,/proc/self/fd/0在我的Linux機器上工作得很好,但我想知道是否沒有這樣的東西內置到bash中(這通常會是可取的)。

+0

您似乎在尋找[this](http://stackoverflow.com/questions/3173131/redirect-copy-of-stdout-to-log-file-from-within-bash-script-itself)。 – devnull

+0

偉大的使用案例,但問題標題的措辭並沒有做到公平 - 也許是'持久重定向stdout和stderr在bash中'的說法。此外,考慮到找到的解決方案,我建議更新問題以使其專注於_intent_而不是您最初的解決方案嘗試。 – mklement0

回答

2

,基本解決方案:

#!/bin/bash 
LOG=/dev/null 

# uncomment next line for debugging (logging) 
# LOG=/tmp/some_file 

{ 
    some_command 
    echo "blah" 
} | tee 1>$LOG 2>&1 

更進化:

#!/bin/bash 

ENABLE_LOG=0  # 1 to log standard & error outputs 
LOG=/tmp/some_file 

{ 
    some_command 
    echo "blah" 
} | if (($ENABLE_LOG)) 
then 
    tee 1>$LOG 2>&1 
fi 

更優雅的解決方案DevSolar's idea

#!/bin/bash 

# uncomment next line for debugging (logging) 
# exec 1> >(tee /tmp/some_file) 2>&1 

some_command 
echo "blah" 
+0

特別是,我喜歡解決方案2和3(儘管至少3我已經嘗試過不做我想要的)。無論如何,關於'exec'的暗示都是黃金。這正是我需要的,謝謝。 – Damon

1

如果我已經清楚地瞭解你的需求,下面應該做你想要什麼

exec 2>&1 
exec >> $LOG 

stdout和隨後的所有命令的標準錯誤將被附加到文件$LOG

+0

誤解了我的意圖,但非常好,謝謝。這給了我需要的信息(不知道你可以這樣使用'exec')。 – Damon

2

多虧了olibre和suvayu的真棒提示,我想出了這個(備案,版本,我現在用的):

# log to file 
# exec 1>> /tmp/logfile 2>&1 

# be quiet 
# exec 1> /dev/null 2>&1 

# dump to console 
exec 2>&1 

只需要取消對三者之一,這取決於什麼是理想的,不用擔心別的,再一次。這要麼記錄所有後續輸出到文件到控制檯,根本沒有。
沒有輸出重複,每個命令(沒有明確的重定向)通用相同,沒有奇怪的東西,並儘可能容易。

+0

是的完美;-)在我的回答中,我沒有管理'crontab'輸出需要丟棄的情況+1(我在寫回答的時候忘記了這種情況!) – olibre

+1

偉大的總結;值得添加一件事(基於@ devnull的[鏈接](http://stackoverflow.com/questions/3173131/redirect-copy-of-stdout-to-log-file-from-within-bash-script-itself)) :要在文件中捕獲stderr和stdout並同時輸出到stdout,請使用'exec&>>(tee/tmp/logfile)' – mklement0