我正在运行一个带有选项.t1,.t2{
tr > td {
color: red;
}
}
的Unix工具。我想将它重定向到一个管道,如下所示:
-l log_file
不幸的是,当我指定my_tool -l /dev/tty | grep "Aye, Caramba!"
时,/dev/tty
的输出会直接转到控制台窗口,绕过my_tool
。
我也试过grep
,但没有用。
因此问题是:我需要为上面的选项/dev/stdout
指定什么才能将相应的输出捕获到管道中?
答案 0 :(得分:2)
您可以尝试使用named pipe:
mkfifo pipe
grep "Aye, Caramba!" pipe &
my_tool -l pipe
在这个例子中,grep将打开pipe
进行读取,这将阻塞,直到另一个进程打开它进行写入。当my_tool将数据写入管道时,grep将能够读取数据。一旦my_tool关闭pipe
,grep将获得文件结束指示并退出。
答案 1 :(得分:2)
您可以使用process substitution创建一个文件句柄,用于管理通过命令管道写入句柄的任何内容。
例如,这应该有效:
my_tool -l >(grep "Aye, Caramba!" > path/to/store/partial.log)
这会将my_tool
/dev/fd/XXX
路径传递给它。写入该路径的任何内容都通过grep
传送,然后写入partial.log
文件。
在功能上,这类似于Kenster关于使用命名管道的建议,但在我看来,流程替换通常更容易使用和推理。
答案 2 :(得分:0)
运行生成日志的一个进程可能很有用,而另一个进程在创建日志并使用grepping其输出之后
为此,在一个控制台中,您可以运行my_tool,生成所需的日志。
no matching function for call to 'std::vector<projectile>::push_back(sf::Vector2<float>, sf::Vector2<float>)'|
然后在另一个控制台中运行:
my_tool -l /tmp/mylog
tail -f -n+0 /tmp/mylog | grep --line-buffered the_pattern_to_match
将打印作为参数传递的文件的“最后”行。 tail
告诉tail处理完整文件,直到它写入的位置。 -n+0
告诉tail保持文件打开并继续发送到达标准输出的任何内容(在这种情况下重定向到管道)。
然后在grep中你会想要-f
所以它不会在打印自己的输出之前等待尾部完成。
我希望这会有所帮助。
答案 3 :(得分:0)
尝试my_tool -l /dev/stdout | grep
同样如Zach建议的那样,命令本身可能支持其他一些选项。