【问题标题】:Bash: How to direct output to both stderr and to stdout, to pipe into another command?Bash:如何将输出定向到 stderr 和 stdout,以管道传输到另一个命令?
【发布时间】:2016-08-17 23:30:14
【问题描述】:

我知道这个问题的变体已经被问到并回答了several times before,但我要么误解了解决方案,要么试图做一些古怪的事情。我的直觉是它不应该需要tee,但也许我完全错了......

给定这样的命令:

sh
echo "hello"

我想将它发送到 STDERR,以便它可以在控制台上记录/查看,以便它可以发送到另一个命令。例如,如果我运行:

sh
echo "hello" SOLUTION>&2 > myfile.txt

SOLUTION> 是我问题的答案)

我想要:

  • hello 像任何其他 STDERR 消息一样显示在控制台中
  • 文件myfile.txt 包含hello

【问题讨论】:

  • AFAIK,bash 流重定向不能复制流。这就是tee 存在的意义所在。据我所知,您的问题与stackoverflow.com/q/3141738 完全相同

标签: bash stdout stderr


【解决方案1】:

无需将其重定向到stderr。只需使用tee 将其发送到文件,同时发送到stdout,它将转到终端。

echo "hello" | tee myfile.txt

如果您想将输出通过管道传输到另一个命令而不将其写入文件,那么您可以使用

echo "hello" | tee /dev/stderr | other_command

您还可以编写一个与tee /dev/stderr 等效的shell 函数:

$ tee_to_stderr() {
    while read -r line; do
        printf "%s\n" "$line";
        printf "%s\n" "$line" >&2
    done
}

$ echo "hello" | tee_to_stderr | wc
hello
       1       1       6

这不适用于二进制输出,但由于您打算使用它在终端上显示文本,因此不必担心。

【讨论】:

  • 谢谢!我已经看到了这个答案的一些变体,但需要注意的是,并非所有系统都有/dev/stderr,我想知道使用 stderr 文件描述符会是什么样子。另一方面,/dev/stderr 缺乏通用标准并不是我的一个大问题,所以这个答案对我来说同样适用。
  • shell 没有任何内置机制可以将输出复制到多个 fd。并且 tee 没有直接写入 fd 的选项。你可以编写一个 shell 函数来完成它。
【解决方案2】:

tee 将标准输入复制到其命令行上的文件,也复制到标准输出。

echo hello | tee myfile.txt >&2

这会将hello 保存在myfile.txt 中,并将其打印到stderr。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-06-21
    • 2013-01-12
    • 2012-02-26
    • 1970-01-01
    • 1970-01-01
    • 2019-11-08
    相关资源
    最近更新 更多