[英]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.