在shell脚本中,如何将标准输出重定向到控制台,并将标准输出和标准错误都重定向到一个文件中?

15 浏览
0 Comments

在shell脚本中,如何将标准输出重定向到控制台,并将标准输出和标准错误都重定向到一个文件中?

我需要将stdout重定向到控制台,并将stdout和stderr重定向到一个文件中。这需要在一个shell脚本中完成。

我找到了下面的代码,可以将stdout和日志文件同时重定向,现在我需要将stderr从控制台中删除。

exec > >(tee -i "output.log") 2>&1

你能帮我解决这个问题吗?

0
0 Comments

问题的原因是,用户希望在shell脚本中将stdout重定向到控制台,同时将stdout和stderr都重定向到一个文件中。然而,用户尝试的几种方法都没有达到这个目的。

解决方法是使用管道和重定向操作符来实现。下面是几种可行的方法:

方法一:

your-command 2>&1 | tee -i "output.log"

这个命令将stdin和stderr都重定向到tee -i output.log,tee命令会在写入文件前先将文本输出到控制台。

方法二:

your-command 2>/dev/null | tee -i "output.log"

这个命令将stderr重定向到/dev/null,即忽略stderr的输出,然后将stdin和stdout都重定向到tee -i output.log

方法三:

exec > >(tee -i "output.log") 2>/dev/null

这个命令使用exec命令将stdout重定向到tee -i output.log,同时将stderr重定向到/dev/null。

然而,以上方法都没有实现用户想要的效果。

0
0 Comments

在一个shell脚本中,如何将stdout重定向到控制台,并将stdout和stderr都重定向到一个文件?

这个问题的出现是因为我们在shell脚本中经常需要将输出信息分别重定向到控制台和文件中,以便在执行过程中能够实时查看输出,并且将输出保存到文件中以便后续分析。

解决这个问题的方法是使用重定向符号和tee命令。在给出的示例中,使用了以下命令:

exec 1> >( tee stdout.txt ) 2> stderr.txt

这个命令的作用是将stdout重定向到一个进程中,由该进程负责将输出同时发送到控制台和stdout.txt文件中。而stderr则直接被重定向到stderr.txt文件中。

这样,就实现了将stdout重定向到控制台和文件中,同时将stderr重定向到文件中的效果。

需要注意的是,如果想让stdout和stderr都重定向到同一个文件中,可以使用相同的文件名。但是在程序崩溃时,两个流可能会发生重叠,导致信息混乱。因此,建议不要将两个流交叉重定向到同一个文件中,以避免可能出现的问题。

总结起来,通过使用重定向符号和tee命令,我们可以实现将stdout重定向到控制台和文件中,同时将stderr重定向到文件中的需求。这样可以方便地查看程序的输出,并将输出保存到文件中供后续分析使用。

0
0 Comments

这个问题的原因是想要将stdout重定向到控制台,同时将stdout和stderr都重定向到一个文件。解决方法是使用shell脚本中的tee命令。

在这个问题中,作者测试了以下代码:

echo '' > out.log
exec 1> >(tee -a -i out.log) 2> >(tee -a -i out.log > /dev/null)
>&2 echo yay
echo nay

在这段代码中,stderr的内容被重定向到文件而不是控制台,而stdout被同时重定向到文件和控制台。

作者提出了一个问题,他认为下面的代码是否可以达到相同的效果:

exec 2>output.log > >(tee /dev/tty >&2)

答案是肯定的,这段代码确实可以达到相同的效果。

为什么需要两个tee命令呢?因为作者想要将stderr只重定向到日志文件,而不输出到控制台。

0