在bash中重定向到stdout

时间:2013-07-31 11:17:41

标签: bash

是否有一个可分配给变量的文件名(即不是像&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中是否已经没有内置这种东西(通常更喜欢)。

4 个答案:

答案 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