我有时想在中间输出管道的内容(不是我们都是吗?)。
我通常这样做(是的,我知道还有其他的,可能更好的方法):
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
换句话说,我吞下了管道中间的输出。
现在我接受这绝对是第一个世界问题,但它让我烦恼,我想知道为什么第二个解决方案不起作用。
任何?
答案 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}'