标签: tee

管道输出到两个不同的命令

可能重复:
osx/linux:管道分为两个进程?

有没有办法将输出从一个命令输入到另外两个命令的输入中,同时运行它们?

像这样的东西:

$ echo 'test' |(cat) |(cat)
test
test
Run Code Online (Sandbox Code Playgroud)

我想这样做的原因是我有一个程序从USB SDR设备接收FM无线电信号,并输出音频作为原始PCM数据(如.wav文件,但没有标题.)由于信号不是音乐但POCSAG寻呼机数据,我需要将其传输到解码器程序以恢复寻呼机文本.但是我也想听信号,所以我知道是否有任何数据进入.(否则我无法判断解码器是否损坏或者没有广播数据.)因此,除了将数据传输到寻呼机解码器之外,我还需要将相同的数据传输到play命令.

目前我只知道如何做一个 - 将其传输到解码器并静默读取数据,或将其传输到play并听到它而不会看到任何解码文本.

如何将相同的数据传输到两个命令,以便我可以阅读文本并听到音频?

我无法使用tee,因为它只将重复数据写入文件,但我需要实时处理数据.

bash pipe tee

24
推荐指数
3
解决办法
2万
查看次数

如何组合输出流,以便输出一次多个位置?

我想将两个(或更多)流组合成一个.我的目标是将任何输出定向到cout,cerr并且clog还将其与原始流一起输出到文件中.(例如,当事情记录到控制台时.关闭后,我仍然希望能够返回并查看输出.)

我在考虑做这样的事情:

class stream_compose : public streambuf, private boost::noncopyable
{
public:
    // take two streams, save them in stream_holder,
    // this set their buffers to `this`.
    stream_compose;

    // implement the streambuf interface, routing to both
    // ...

private:
    // saves the streambuf of an ios class,
    // upon destruction restores it, provides
    // accessor to saved stream
    class stream_holder;

    stream_holder mStreamA;
    stream_holder mStreamB;
};
Run Code Online (Sandbox Code Playgroud)

这看起来很简单.然后在main中的调用将是这样的:

// anything that goes to cout goes to both …
Run Code Online (Sandbox Code Playgroud)

c++ boost iostream stream tee

20
推荐指数
3
解决办法
8910
查看次数

使用tee(或等效)但限制最大文件大小或旋转到新文件

我想捕获UNIX进程的输出,但限制最大文件大小和/或旋转到新文件.

我见过logrotate,但它不能实时工作.据我了解,这是一项并行运行的"清理"工作.

什么是正确的解决方案?我想我会编写一个小脚本来完成它,但我希望现有的文本工具有一个简单的方法.

想像:

my_program | tee --max-bytes 100000 log/my_program_log

会给...总是将最新的日志文件写为:log/my_program_log

然后,当它填充...重命名为log/my_program_log000001并启动一个新的log/my_program_log.

unix shell logging tee

20
推荐指数
4
解决办法
1万
查看次数

Tee不显示输出或写入文件

我编写了一个python脚本来监视某些网络资源的状态,如果你愿意,那就是无限的.它永远ping相同的3个节点,直到它收到键盘中断.我尝试使用tee将程序的输出重定向到文件,但它不起作用:

? sudo ./pingster.py

15:43:33        node1 SUCESS | node2 SUCESS | node3 SUCESS
15:43:35        node1 SUCESS | node2 SUCESS | node3 SUCESS
15:43:36        node1 SUCESS | node2 SUCESS | node3 SUCESS
15:43:37        node1 SUCESS | node2 SUCESS | node3 SUCESS
15:43:38        node1 SUCESS | node2 SUCESS | node3 SUCESS
^CTraceback (most recent call last):
  File "./pingster.py", line 42, in <module>
    main()
  File "./pingster.py", line 39, in main
    sleep(1)
KeyboardInterrupt

? sudo ./pingster.py | tee ping.log
# wait a few seconds …
Run Code Online (Sandbox Code Playgroud)

python bash tee colorama

19
推荐指数
1
解决办法
5305
查看次数

关于协程的itertools.tee?

我有一个对象的树形结构.我需要遍历叶子中的所有项目("值").为此,我目前正在使用如下所示的生成器方法:

class Node(object):
    def __init__(self):
        self.items = [Leaf(1), Leaf(2), Leaf(3)]

    def values(self):
        for item in self.items:
            for value in item.values():
                yield value

class Leaf(object):
    def __init__(self, value):
        self.value = value

    def values(self):
        for i in range(2):
            yield self.value

n = Node()
for value in n.values():
    print(value)
Run Code Online (Sandbox Code Playgroud)

这打印:

1
1
2
2
3
3
Run Code Online (Sandbox Code Playgroud)

现在,a返回的值Leaf将取决于外部参数.我正在考虑使用协程能够将此参数传递给叶节点:

import itertools

class Node2(object):
    def __init__(self):
        self.items = [Leaf2(1), Leaf2(2), Leaf2(3)]

    def values(self):
        parameter = yield
        for item in self.items:
            item_values = item.values()
            next(item_values) …
Run Code Online (Sandbox Code Playgroud)

python generator coroutine tee python-itertools

16
推荐指数
1
解决办法
626
查看次数

使用tee从python获取实时打印语句

我有一个python脚本,看起来像这样:

for item in collection:
    print "what up"
    #do complicated stuff that takes a long time.
Run Code Online (Sandbox Code Playgroud)

在bash中,我通过执行以下操作来运行此脚本:

$ python my.py | tee my_file.txt
Run Code Online (Sandbox Code Playgroud)

但是,我在bash中看到的只是一个空行,直到程序结束.然后,所有的打印语句都在一个.

这是发球台的预期操作吗?我可以使用T恤实时查看输出吗?

python stdout tee

16
推荐指数
1
解决办法
5323
查看次数

发球和退出状态

是否有"tee"的替代方法,它捕获正在执行的命令的STDOUT/STDERR,并以与处理的命令相同的退出状态退出.如下:

eet -a some.log -- mycommand --foo --bar
Run Code Online (Sandbox Code Playgroud)

其中"eet"是"tee":)的假想替代品(-a表示追加, - 分隔捕获的命令)不应该很难破解这样的命令但是它可能已经存在并且我不知道它?

谢谢.

unix shell tee

15
推荐指数
3
解决办法
1万
查看次数

Unix:混乱使用Tee -command

手动说明发球台是"管道配件" - 工具.案件[1]让我困惑:

案件

echo "foo bar" | sudo tee -a /path/to/some/file
Run Code Online (Sandbox Code Playgroud)

2.案件

:w !sudo tee %
Run Code Online (Sandbox Code Playgroud)

从案例中很难理解发球台的逻辑.发球怎么样?

unix tee

14
推荐指数
3
解决办法
2万
查看次数

如何将stdout + stderr重定向到一个文件,同时保持流分离?

重定向stdout + stderr,以便在仍然输出到stdout时写入文件都很简单:

cmd 2>&1 | tee output_file
Run Code Online (Sandbox Code Playgroud)

但是现在来自cmd的stdout/stderr都来了stdout.我想将stdout + stderr写入同一个文件(因此,假设cmd是单线程的,则保留排序)但是仍然可以单独重定向它们,如下所示:

some_magic_tee_variant combined_output cmd > >(command-expecting-stdout) 2> >(command-expecting-stderr)
Run Code Online (Sandbox Code Playgroud)

因此,combined_output包含保留顺序的两者,但命令期望-stdout仅获取stdout,而命令期望-stderr仅获取stderr.基本上,我想记录stdout + stderr,同时仍然允许stdout和stderr分别重定向和管道.发球方法的问题在于它们将它们融合在一起.有没有办法在bash/zsh中执行此操作?

unix bash shell zsh tee

14
推荐指数
1
解决办法
6216
查看次数

Unix:如何将输出预先添加到文件中?

具体来说,我使用的组合>>,并tee在自定义的别名存储在屏幕上的一个文本文件中新家酿的更新,以及输出:

alias bu="echo `date "+%Y-%m-%d at %H:%M"` \
    >> ~/Documents/Homebrew\ Updates.txt && \
    brew update | tee -a ~/Documents/Homebrew\ Updates.txt"
Run Code Online (Sandbox Code Playgroud)

:如果我想什么前面加上这个输出在我的文本文件,即放置在文件的开头,而不是将其附加到最后?


编辑1:正如有人在下面的答案中报告的那样,使用临时文件可能是一个很好的方法,这至少对我有所帮助:

targetLog="~/Documents/Homebrew\ Updates.txt"
alias bu="(brew update | cat - $targetLog \
> /tmp/out1 && mv /tmp/out1 $targetLog \
&& echo `date "+%Y-%m-%d at %H:%M":%S` | \
cat - $targetLog > /tmp/out2 \
&& mv /tmp/out2 $targetLog)"
Run Code Online (Sandbox Code Playgroud)

但问题是STDOUT的输出(之前由tee实现),我不确定是否可以将其纳入此tempfile方法......?

unix bash redirect tee

13
推荐指数
3
解决办法
1万
查看次数

标签 统计

tee ×10

unix ×5

bash ×4

python ×3

shell ×3

boost ×1

c++ ×1

colorama ×1

coroutine ×1

generator ×1

iostream ×1

logging ×1

pipe ×1

python-itertools ×1

redirect ×1

stdout ×1

stream ×1

zsh ×1