2013-07-31 40 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