使用茶的怪异:任何人都可以解释一下吗?

时间:2013-05-22 14:28:53

标签: bash tee

我有时想在中间输出管道的内容(不是我们都是吗?)。

我通常这样做(是的,我知道还有其他的,可能更好的方法):

terminal=$(tty) 
echo hello world |tee $terminal|awk '{print $2, $1}'

输出

hello world
world hello

这很好,在所有方面都很可爱。

除非我真的喜欢这样做而不创建$ terminal变量。 您可以轻松地将“tee $terminal”替换为管道中的“tee $(tty)”,而不需要变量?正确?

错误。

echo hello world |tee $(tty)|awk '{print $2, $1}'

输出

world hello

换句话说,我吞下了管道中间的输出。

现在我接受这绝对是第一个世界问题,但它让我烦恼,我想知道为什么第二个解决方案不起作用。

任何?

2 个答案:

答案 0 :(得分:7)

如果您的系统支持,您可以使用/dev/tty直接访问当前终端:

echo hello world | tee /dev/tty | awk '{print $2, $1}'

(无论如何,该文件在Linux和Mac OS X中都可用。)

tty命令返回连接到标准输入的文件的名称,该文件可能不一定是终端。在您的管道中,它是与前一个命令的标准输出相关联的“文件”。

答案 1 :(得分:1)

如果您的系统支持,您还可以使用tee进行代理替换:

echo hello world | tee  >(awk '{print $2, $1}')

该行有时来得太晚,因此如果需要,您可能需要在末尾添加; sleep .01

或者您可以使用标准错误进行报告:

echo hello world | tee >(cat >&2) |  awk '{print $2, $1}'