符合我的期望
cat <(shuf my_ordered_playlist.m3u)
echo <(shuf my_ordered_playlist.m3u)
vlc my_ordered_playlist.m3u
不符合我的预期
vlc <(shuf my_ordered_playlist.m3u)
我想做的事
- 在每次调用 vlc 和
- 按下后退按钮时能够后退(
--random
提供较差的支持)。
其他注意事项
- 我可以使用此处的文档实现我想要做的事情
<<<
吗?
cat <(shuf my_ordered_playlist.m3u)
echo <(shuf my_ordered_playlist.m3u)
vlc my_ordered_playlist.m3u
vlc <(shuf my_ordered_playlist.m3u)
--random
提供较差的支持)。<<<
吗?
因为
vlc
在这件事上设计得不好。更糟糕的是,它设计得很糟糕两次:可能有其原因*以一种会产生以下两个缺点的方式工作:
inotifywait -m my_ordered_playlist.m3u
显示vlc my_ordered_playlist.m3u
文件被打开并读取了几次。我还没有调查是否涉及寻求。当您使用<(shuf my_ordered_playlist.m3u)
vlc
获取数据时shuf
,它能够准确地读取一次。显然这还不够。在一个完美的世界vlc
中,只读取一次数据就足够了。vlc
拒绝使用没有扩展名的播放列表。在 Zsh 中有=()
类似于<()
;的语法。不同之处在于 shell 创建了一个临时的常规文件而不是管道。这样的文件可以被多次读取并且是可查找的。这似乎是您的问题的一个很好的解决方案(如果您对 Zsh 没问题),但通常文件名没有扩展名,所以vlc =(shuf my_ordered_playlist.m3u)
仍然不起作用。但是有一种方法:
如果您希望更改
TMPSUFFIX
不影响主 shell,请在子 shell 中运行命令。*声明“
vlc
设计不佳”收到了有用的评论:另一种选择是分两个阶段进行,并将已经洗牌的播放列表在文件中而不是在命令行中传递给 VLC。
您甚至可以将其扩展到
在 VLC 退出后进行清理。
你甚至可以使用bash 别名
然后运行
shuf_vlc
以随机播放您的播放列表。您的命令不起作用的原因是它仍然是管道并且受管道的限制。
过程替代的局限性
根据您看到的行为,可能是 VLC 正在寻求检查有效的播放列表(以检查 UTF-8/16 等或文件构造正确),但实际上并未首先读取播放列表经过。它尝试返回实际加载文件,并且由于“无文件搜索”而无法读取播放列表。第一遍有效地清空了给定文件描述符的管道,然后就没有什么可处理的了。
或者,VLC 检查文件是“真实的”并且能够被
seek
编辑,并且发现它不能简单地拒绝打开它,因为它将无法通过文件向前和向后解析。你的前两个命令很简单,只需要一个可读的流,VLC 想要一些它可以坚持的真实的东西。