在shell脚本中,如何将标准输出重定向到控制台,并将标准输出和标准错误都重定向到一个文件中?
问题的原因是,用户希望在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。
然而,以上方法都没有实现用户想要的效果。
在一个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重定向到文件中的需求。这样可以方便地查看程序的输出,并将输出保存到文件中供后续分析使用。
这个问题的原因是想要将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只重定向到日志文件,而不输出到控制台。