Linux / Debian-moreutils中的“小便”有什么作用?


Answers:


29

这是您可以使用小便的方法:

seq 5 -1 1 > file
cat file |pee 'sort -u > sorted' 'sort -R > unsorted'

因此,小便使用Shell管道而不是文件。

bash不需要小便,它可以将shell命令作为文件打开:

cat file |tee >(sort -u > sorted) >(sort -R > unsorted)

1
这可以与文件名的jockers一起使用吗?参见zgp.org/~dmarti/tips/git-multiple-post-receive-hooks-pee用于对stdin每个脚本进行复制并为每个脚本提供克隆,以文件名模式进行数学运算,纯bash可以做到这一点吗?在AFAIU中,它会在括号内放大星号tee >(app1 app2 app3 app4),而不是>(app1) >(app2) >(app3) >(app4)您的答案所示

@ Arioch,bash语法不适用于hooks-joker技术。只需安装moreutils。
东武

1
使用tee >/dev/null以避免复制标准输入到标准输出
JFS

1
与tee相比,pee的真正优势在于它将stdout从每个子进程发送到pee本身的stdout。如果要保存,使用tee需要将每个进程标准输出重定向到一个文件,而使用pee则只需要保存该标准输出。当然,这仅在每个子命令都输出类似格式的内容时才有意义。就像如果您不知道如何在grep中进行操作或使用正则表达式一样,可以cat file | pee 'grep this' 'grep that' > lines.with.this.or.that.txt使用...使用tee来获取filestdout 的副本。
2014年

>(command)功能称为“ 流程替换”
VlastimilOvčáčík

16

如果您tee先使用过,可能更容易理解。这个有用的旧工具接受标准输入,并写出到多个文件以及标准输出。下列:

echo "Hello world" | tee one two

将创建两个名为one和的文件,两个文件two均包含字符串Hello world。它还将打印到您的终端。


现在pee执行类似的功能,但不是将输出重定向到多个文件,而是将其重定向到多个辅助命令,即ala管道。它与tee不将原始stdin发送到stdout的方面稍有不同,因为将它与辅助命令的输出组合起来没有任何意义。以下是非常简单的示例:

echo "Hello world" | pee cat cat

将字符串输出Hello world到终端两次。这是因为的两个实例中的每个实例都cat接收标准输出并执行cat打印操作。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.