在管道之后运行多个命令

在管道之后运行多个命令

我正在将流媒体输出传输到 mpv 播放器,效果很好。

streamer -o -  |  mpv - 

但在启动 mpv 之前,我想终止一个程序,然后通过管道传输到 mpv。

Streamer程序需要一些时间来缓冲视频,10-15秒后,它会发送到mpv。在这 10-15 秒内,我想显示 screen_saver,然后在流媒体开始发送到 mpv 时终止它。

下面的命令只是终止 screen_saver 但不运行 mpv。

streamer -o -  | pkill screen_saver ;  mpv - 

答案1

streamer -o -  | { dd bs=1 count=1 2>/dev/null; pkill screen_saver; cat; } | mpv -

来自 的第一个字节streamer被捕获dd并通过 Beyond }dd立即终止,pkill运行,然后其他一切都会进行cat。所有的流都应该到达mpv.

这需要pkill在其标准输出上保持沉默并且不从 中读取任何内容streamer。我的pkill就是这样。以防万一您可能想确保:</dev/null pkill screen_saver >/dev/null


要使用常用工具测试该想法,请运行:

cat | { dd bs=1 count=1 2>/dev/null; echo "triggered" >&2; cat; } | cat

并输入一些内容(第一个cat可能只有在您点击后才会得到任何内容Enter)。您将看到triggered<newline>插入在输入的第一个字节之后。请注意,该字符串不会干扰最后cat获取的流,因为它被打印到 stderr;它在这里只是为了显示当您需要时会发生触发。

请记住,dd它适用于字节,因此如果您输入的第一个字符是多字节(例如śUTF-8),那么输出可能会让您感到惊讶(因为您的控制台处理和交错命令的 stdout 和 stderr)。这仅意味着触发发生在角色中间,就在第一个角色之后字节,完全按照设计。

相关内容