首页 > 解决方案 > 如果我将输出通过管道传输到 tee,则无法“继续”

问题描述

我有一个 bash 脚本,它使用以下结构几乎可以完成我想要的工作:

for x in 1 2 3
do
  {
  [[ $x -ne 2 ]] || continue
  echo $x
  } &>> foo.log
done

我需要更改它,以便输出同时发送到终端和日志文件。但是,这不起作用:

for x in 1 2 3
do
  {
  [[ $x -ne 2 ]] || continue
  echo $x
  } 2>&1 | tee -a foo.log
done

看起来,通过创建一个进程,管道阻止我使用continue.

当然,我可以在没有 的情况下重写我的脚本的逻辑continue,但在我开始之前,我想知道我是否错过了一种更直接的方法来实现我想要的。

标签: bashio-redirectioncontinuecurly-braces

解决方案


您可以将输出重定向到进程替换。

for x in 1 2 3
do
  {
  [[ $x -ne 2 ]] || continue
  echo $x
  } 2>&1 > >(tee -a foo.log)
done |
# I suggest to do pipe the output to ex. `cat`, so that the output 
# of process substitution will be synchronized with rest of the script
cat

但是为什么不直接重定向整个循环的输出呢?

for x in 1 2 3; do
  [[ $x -ne 2 ]] || continue
  echo $x
done 2>&1 | tee -a foo.log

您可以退出子流程。如果您愿意这样做,我建议您更换{ }( )只是为了安全起见,如果您有一天决定删除tee.

for x in 1 2 3
do
  {
  [[ $x -ne 2 ]] || exit
  echo $x
  } 2>&1 | tee -a foo.log
done

推荐阅读