是否有一个可分配给变量的文件名(即不是像&1
这样的魔法内置shell令牌)可让我重定向到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 :(得分:3)
基本解决方案:
#!/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"
答案 1 :(得分:3)
感谢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
只需要根据需要取消三个中的一个,并且不再担心任何其他事情。此 将所有后续输出记录到文件或到控制台,或根本不记录。
没有输出重复,对于每个命令通常都是相同的(没有显式重定向),没有奇怪的东西,并且它很容易。
答案 2 :(得分:1)
如果我清楚地理解了您的要求,以下内容应该按您的要求进行
exec 2>&1
exec >> $LOG
所有后续命令的stdout和stderr将附加到文件$LOG
。
答案 3 :(得分:0)
使用/dev/stdout
这是另一个提到此解决方案的答案:Difference between stdout and /dev/stdout