目录
内容来源:
GUN : Coreutils - GNU core utilities
busybox v1.36.1 : 【busybox记录】【shell指令】基于的Busybox的版本和下载方式-CSDN博客
【GUN】【tee】指令介绍
tee 将输出重定向到多个文件或进程
tee 命令将标准输入复制到标准输出,也复制到作为参数给出的任何文件。当您不仅希望通过管道发送一些数据,而且还希望保存一份副本时,这非常有用。
简介:
tee [option]... [file]...
如果要写入的文件不存在,则创建该文件。如果要写入的文件已经存在,除非使用-a选项,否则将覆盖该文件先前包含的数据。
在以前版本的GNU coretils(5.3.0-8.23)中,' - '文件会导致tee发送另一个输入副本到标准输出。然而,由于交错输出不是很有用,tee现在符合POSIX并将' - '视为文件名。
程序接受以下选项。请参见第2章[常用选项],第2页。
‘-a’
‘--append’
将标准输入附加到给定的文件中,而不是覆盖它们。
‘-i’
‘--ignore-interrupts’
忽略中断信号。
‘-p’
‘--output-error[=mode]’
调整输出上有错误的行为。总而言之,-p允许 tee 以更合适的方式对管道进行操作,并且如果任何管道输出提前退出,则可以继续将数据处理到任何剩余的输出。
当未指定 --output-error时,默认操作是在向管道写入错误时立即退出,并诊断向非管道写入错误。
长形式的 --output-error选项支持在以下模式之间进行选择:
‘warn’
打开或写入任何输出(包括管道)出错时发出警告。继续写入仍然打开的文件/管道。如果任何输出有错误,退出状态表示失败。
‘warn-nopipe’
这是未指定或使用短形式-p时的默认模式。在打开或写入任何输出(管道除外)时发出错误警告。继续写入仍然打开的文件/管道。如果所有剩余的输出都变成坏掉的管道,立即退出。
如果任何非管道输出有错误,退出状态表示失败。
‘exit’
在打开或写入任何输出(包括管道)时出错退出。
‘exit-nopipe’
在打开或写入任何输出(管道除外)时出错退出。如果所有剩余的输出都变成坏掉的管道,立即退出。
当您碰巧要传输大量数据,并且希望在不读取数据的情况下对数据进行汇总时,tee命令非常有用。
例如,当您下载DVD映像时,您经常希望立即验证其签名或校验和。
低效的方法很简单:
wget https://example.com/some.iso && sha1sum some.iso
上面的一个问题是,它使您在开始耗时的SHA1计算之前等待下载完成。
也许更重要的是,上述操作需要第二次读取DVD映像(第一次是从网络读取的)。
有效的方法是将下载和SHA1计算交错进行。然后,你将免费获得校验和,因为整个过程并行化得非常好:
# slightly contrived, to demonstrate process substitution
wget -O - https://example.com/dvd.iso \
| tee >(sha1sum > dvd.sha1) > dvd.iso
这使得tee不仅写入预期的输出文件,而且写入运行sha1sum的管道,并将最终校验和保存在名为dvd.sha1的文件中。
然而,这个例子依赖于现代shell的一个称为进程替换的特性(上面的' >(command) '语法);请参阅Bash参考手册中的“进程替换”一节,因此它适用于zsh、Bash和ksh,但不适用于/bin/sh。
因此,如果您在shell脚本中编写这样的代码,请以' #!/bin/bash '开始脚本。
如果任何流程替换(或管道标准输出)可能在不消耗所有数据的情况下提前退出,则需要使用-p选项以允许tee继续将输入处理为任何剩余的输出。
由于上面的示例写入一个文件和一个进程,因此更传统和可移植的tee使用会更好:
wget -O - https://example.com/dvd.iso \
| tee dvd.iso | sha1sum > dvd.sha1
您可以扩展这个示例,使tee写入两个进程,并行计算MD5和SHA1校验和。在这种情况下,需要进行流程替换:
wget -O - https://example.com/dvd.iso \
| tee >(sha1sum > dvd.sha1) \
>(md5sum > dvd.md5) \
> dvd.iso
当您想要生成管道内容的压缩副本时,此技术也很有用。考虑一个工具,以图形方式汇总来自' du -ak '的文件系统使用数据。对于大型层次结构,' du -ak '可以运行很长时间,并且很容易产生tb级的数据,因此您不会希望不必要地重新运行该命令。您也不想保存未压缩的输出。
这样做效率很低,你甚至不能启动GUI,直到你压缩了所有的du输出:
du -ak | gzip -9 > /tmp/du.gz
gzip -d /tmp/du.gz | checkspace -a
使用tee和进程替换,您可以立即启动GUI并完全消除解压缩:
du -ak | tee >(gzip -9 > /tmp/du.gz) | checkspace -a
最后,如果您经常一次创建不止一种类型的压缩 tarball,例如,当make dist同时创建gzip-compressed和bzip2-compressed tarball时,可能有更好的方法。
典型的自动生成的Makefile规则按顺序使用命令创建两个压缩的tar存档,如下所示(稍微简化):
tardir=your-pkg-M.N
tar chof - "$tardir" | gzip -9 -c > your-pkg-M.N.tar.gz
tar chof - "$tardir" | bzip2 -9 -c > your-pkg-M.N.tar.bz2
但是,如果你要归档和压缩的层次结构大于几兆字节,特别是如果你使用的是具有大量内存的多处理器系统,那么你可以通过只读取一次目录内容并并行运行压缩程序来做得更好:
tardir=your-pkg-M.N
tar chof - "$tardir" \
| tee >(gzip -9 -c > your-pkg-M.N.tar.gz) \
| bzip2 -9 -c > your-pkg-M.N.tar.bz2
如果你想进一步处理进程替换的输出,并且这些进程自动写入(即,一次写入少于系统的PIPE BUF大小),那么可以使用如下结构:
tardir=your-pkg-M.N
tar chof - "$tardir" \
| tee >(md5sum --tag) > >(sha256sum --tag) \
| sort | gpg --clearsign > your-pkg-M.N.tar.sig
退出状态为0表示成功,非0表示失败
【busybox】【tee】指令介绍
NA
【linux】【tee】指令介绍
[root@localhost bin]# tee --help
用法:tee [选项]... [文件]...
将标准输入复制到每个指定文件,并显示到标准输出。
-a, --append 内容追加到给定的文件而非覆盖
-i, --ignore-interrupts 忽略中断信号
-p 对写入非管道的行为排查错误
--output-error[=模式] 设置写入出错时的行为。见下面“模式”部分
--help 显示此帮助信息并退出
--version 显示版本信息并退出
模式确定向输出写入出错时的行为:
'warn' 对向任何文件输出出错的情况进行诊断
'warn-nopipe' 对向除了管道以外的任何文件输出出错的情况进行诊断
'exit' 一旦输出出错,则退出程序
'exit-nopipe' 一旦输出出错且非管道,则退出程序
-p 选项的默认模式是“warn-nopipe”。
当 --output-error 没有给出时,默认的操作是在向管道写入出错时立刻退出,
且在向非管道写入出错时对问题进行诊断。
GNU coreutils 在线帮助:<https://www.gnu.org/software/coreutils/>
请向 <http://translationproject.org/team/zh_CN.html> 报告 tee 的翻译错误
完整文档请见:<https://www.gnu.org/software/coreutils/tee>
或者在本地使用:info '(coreutils) tee invocation'
使用示例:
NA