将内容输出到标准输出并追加到文件

10

我有这个:

echo "all done creating tables" >> ${SUMAN_DEBUG_LOG_PATH}

但这只会将内容附加到文件中,而不会将其写入标准输出。我如何在同一行中向标准输出写入内容并将其附加到文件中?


它正在写入stdout,这是文件。 - William Pursell
嗯,好的,我想你是对的。那么我怎样才能将stdout导向“控制台”/当前TTY呢?你知道我在问什么 :) - Alexander Mills
3个回答

16

像这样的吗?

echo "all done creating tables" | tee -a  "${SUMAN_DEBUG_LOG_PATH}"

是的,看起来它可以工作 - 你知道 tee 在几乎所有 *nix 机器上是否都可以使用吗?在 macOS 上似乎可以工作。 - Alexander Mills
哦,是的...我认为你会在任何地方都能找到它。在Linux下,它是coreutils的一部分。 - mauro
tee是POSIX标准的一部分。 - chepner
哦糟糕,我忘记问了,这会将stderr发送到TTY和文件吗? - Alexander Mills
2
如果将stderr重定向到stdout,则是: my_command 2>&1 | tee -a my_log - mauro

4

使用tee命令

$ echo hi | tee -a foo.txt
hi
$ cat foo.txt
hi

哦,糟糕,我忘记问了,这会将stderr发送到TTY和文件吗? - Alexander Mills

1
通常使用tee,但也有只使用bash的版本:
#!/bin/bash

function mytee (){
    fn=$1
    shift
    IFS= read -r LINE
    printf '%s\n' "$LINE"
    printf '%s\n' "$LINE" >> "$fn"
}


SUMAN_DEBUG_LOG_PATH=/tmp/abc
echo "all done creating tables" | mytee "${SUMAN_DEBUG_LOG_PATH}"

这是一种情况,纯粹使用bash并不能真正帮助你。无论如何,您都需要为管道的RHS分叉一个新进程,因此最好在该进程中运行tee而不是bash - chepner
这取决于将要记录多少日志。如果很多,exec > >() 也可以工作,但确实会有额外的 fork。这完全取决于 tee 是否可用。然而,tee 无法添加前缀和修改数据,但在 bash 中仍然可以执行此操作。 - CowboyTim
@chepner 感谢您的改进,但是对于Windows文件名的"$fn"也需要fn="$1",我认为是这样的? :-) - CowboyTim
fn="$1" 不会有任何问题,但也并非必要;在赋值语句的右侧不执行单词分割或路径名扩展。 - chepner
@chepner 判断是否为数组赋值。 - 123
有趣的是,只有在缩写形式中才能实现。使用 bar='one two'foo=($bar) 将生成一个带有元素的数组,但是 foo=([0]=$bar) 不会,我猜测这是由于复合赋值内部的简单赋值造成的。 - chepner

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接