繁体   English   中英

在 bash 中重定向到标准输出

[英]Redirect to stdout in bash

是否有一个文件名可以分配给一个变量(即不是像&1这样的魔法内置 shell 令牌),让我重定向到stdout

我最终想要做的是在 cron 脚本中运行这样的东西:

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

方便的是,这让我可以通过重定向到/dev/null来关闭日志噪音,当我确定没有任何事情会失败(或者,至少,没有我关心的事情!)而不重写整个脚本时。 是的,关闭日志记录并不是最好的做法——但是一旦这个脚本运行起来,就不会有太多可以想象的错误,并且不需要用没有人想要阅读的兆字节日志信息来破坏磁盘。
如果 5 年后出现意外故障,仍然可以通过拨动开关再次打开日志记录。

另一方面,在编写和调试脚本(包括从 shell 手动调用它)时,如果它可以将输出转储到控制台,那就太好了。 这样,我就不需要tail日志文件手动。

换句话说,我正在寻找类似于 bash-talk 中的/proc/self/fd/0东西,我可以分配给LOG 碰巧的是, /proc/self/fd/0在我的 Linux 机器上工作得很好,但我想知道 bash 中是否已经内置了这样的东西(这通常是可取的)。

基本解决方案:

#!/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 的想法的更优雅的解决方案

#!/bin/bash

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

some_command
echo "blah"

感谢 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

只需要根据需要取消注释三个中的一个,再不用担心其他任何事情。 要么将所有后续输出记录到文件控制台,要么根本不记录。
没有重复的输出,每个命令的工作方式都一样(没有显式重定向),没有奇怪的东西,而且很容易。

如果我已经清楚地了解您的要求,那么以下内容应该可以满足您的需求

exec 2>&1
exec >> $LOG

所有后续命令的标准输出和标准错误都将附加到文件$LOG

使用/dev/stdout

这是另一个提到此解决方案的 SO 答案: Difference between stdout and /dev/stdout

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM