我正在将流媒体输出传输到 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)。这仅意味着触发发生在角色中间,就在第一个角色之后字节,完全按照设计。