shell如何在保持少数屏幕的同时将所有消息定向到文件

时间:2016-04-26 22:32:47

标签: shell output stdout logfile

echo start commanda
output=$(commanda soemthing)
echo $output

echo start commandb
output=$(commandb something)
echo $output`

我如何在shell中这样做,以便我保持:

echo start commanda
echo start commandb

在stdout中,同时保持:​​

echo start commanda
echo $output
echo start commandb
echo $output

在日志文件中?

1 个答案:

答案 0 :(得分:1)

如果希望stdout转到文件,请使用重定向。如果您希望它去两个地方,请使用tee

echo start commanda | tee -a logfile
output=$(commanda soemthing)
echo $output >>logfile

echo start commandb | tee -a logfile
output=$(commandb something)
echo $output >>logfile

工作原理:

  • >>logfile称为重定向。它捕获stdout并将其附加到文件logfile

  • | tee -a logfile捕获上一个命令的标准输出,将副本附加到logfile并再次将其复制到标准输出。如果您希望覆盖该文件而不是附加到该文件,则省略-a

替代方法

以下内容将所有输出发送到logfile。以start开头的任何输出行也会发送到stdout:

{
    echo start commanda
    output=$(commanda soemthing)
    echo $output

    echo start commandb
    output=$(commandb something)
    echo $output
} | tee -a logfile | grep '^start'

大括号{...}将语句组合在一起,这样我们只需要重定向整个组。这减少了文件logfile打开和关闭的次数。这种方法的缺点是,如果outputstart开头,它也会被发送到stdout。