可能重复:
osx/linux:管道分为两个进程?
有没有办法将输出从一个命令输入到另外两个命令的输入中,同时运行它们?
像这样的东西:
$ echo 'test' |(cat) |(cat)
test
test
Run Code Online (Sandbox Code Playgroud)
我想这样做的原因是我有一个程序从USB SDR设备接收FM无线电信号,并输出音频作为原始PCM数据(如.wav文件,但没有标题.)由于信号不是音乐但POCSAG寻呼机数据,我需要将其传输到解码器程序以恢复寻呼机文本.但是我也想听信号,所以我知道是否有任何数据进入.(否则我无法判断解码器是否损坏或者没有广播数据.)因此,除了将数据传输到寻呼机解码器之外,我还需要将相同的数据传输到play命令.
目前我只知道如何做一个 - 将其传输到解码器并静默读取数据,或将其传输到play并听到它而不会看到任何解码文本.
如何将相同的数据传输到两个命令,以便我可以阅读文本并听到音频?
我无法使用tee,因为它只将重复数据写入文件,但我需要实时处理数据.
我想将两个(或更多)流组合成一个.我的目标是将任何输出定向到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) 我想捕获UNIX进程的输出,但限制最大文件大小和/或旋转到新文件.
我见过logrotate,但它不能实时工作.据我了解,这是一项并行运行的"清理"工作.
什么是正确的解决方案?我想我会编写一个小脚本来完成它,但我希望现有的文本工具有一个简单的方法.
想像:
my_program | tee --max-bytes 100000 log/my_program_log
会给...总是将最新的日志文件写为:log/my_program_log
然后,当它填充...重命名为log/my_program_log000001并启动一个新的log/my_program_log.
我编写了一个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) 我有一个对象的树形结构.我需要遍历叶子中的所有项目("值").为此,我目前正在使用如下所示的生成器方法:
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脚本,看起来像这样:
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恤实时查看输出吗?
是否有"tee"的替代方法,它捕获正在执行的命令的STDOUT/STDERR,并以与处理的命令相同的退出状态退出.如下:
eet -a some.log -- mycommand --foo --bar
Run Code Online (Sandbox Code Playgroud)
其中"eet"是"tee":)的假想替代品(-a表示追加, - 分隔捕获的命令)不应该很难破解这样的命令但是它可能已经存在并且我不知道它?
谢谢.
手动说明发球台是"管道配件" - 工具.案件[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)
从案例中很难理解发球台的逻辑.发球怎么样?
重定向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中执行此操作?
具体来说,我使用的组合>>,并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方法......?