5 tee
在遇到了大约 3 种tee
我认为不切实际的解释后,我会要求对这个命令提供一个简单、通用和分步(如果可能)的解释,针对 Linux 新手。
我确实理解我们通过管道、命令的标准输出或直接使用某个文件来使用它,但我想我想念命令实际对这些内容执行的操作以及它何时有用。
所以这就是我要问的,希望能找到一个有教益的解释,以清晰、循序渐进的方式服务于新人:
命令如何与命令的标准输出或文件本身一起使用?
为什么说tee
读取标准输入很常见?我的意思是,如果我这样做ls -l
,tee
不会读取语法ls -l
本身,而是读取它打印到会话中的标准输出。
另外,如果你愿意,请分享一个你日常工作中的实际例子,什么时候tee
对你非常有用?
Kus*_*nda 14
从tee
我的系统上的手册:
tee 实用程序将标准输入复制到标准输出,在零个或多个文件中进行复制。输出是无缓冲的。
因此,它从标准输入读取并将其复制到标准输出,同时还将流复制到一个或多个文件中。
在以下管道中,tee
将获取管道中第一个命令的输出并将其复制到标准输出(终端),同时还在文件中复制它one
,two
并且three
:
$ somecommand | tee one two three
Run Code Online (Sandbox Code Playgroud)
tee
有很多用途,一种是结合sudo
将输出重定向到 root 拥有的文件:
$ somecommand | sudo tee /root/somefile >/dev/null
Run Code Online (Sandbox Code Playgroud)
由于重定向以非特权用户身份发生(它也可能以 root 身份运行,这可能是不需要的),因此以下将不起作用somecommand
:
$ sudo somecommand >/root/somefile
Run Code Online (Sandbox Code Playgroud)
一次将一组固定的行附加到许多文件的人工示例(对所有用户~/.profile
文件,假设*
扩展到用户名并且扩展的命令行不会变得太长,shell 无法处理):
$ tee -a /home/*/.profile <<'END_NEWPATH'
PATH="$PATH:/opt/bin"
END_NEWPATH
Run Code Online (Sandbox Code Playgroud)
使用的真实示例tee
:
time doas box-build.sh 2>&1 | tee build.out | grep '^=*>'
Run Code Online (Sandbox Code Playgroud)
这是我构建 OpenBSD 基础系统。doas
是OpenBSD 的“等价物”,sudo
并且box-build.sh
是一个用于构建的小型 shell 脚本(本质上是cd /usr/src && make obj && make build
)。我想存储整个构建过程的输出,包括任何错误或警告,但我不想让所有内容都涌入我的终端。为此,我使用tee
将所有内容保存到其中build.out
,然后grep
仅获得我们在终端中的进程中的位置的提示。
另请参阅此处标有tee标签的其他问题。