Seb*_*ian 2 grep pipe mplayer shell-script console
我玩弄的命令行界面的mplayer。我想用以下方式编写脚本
find /some/path/ -type f | grep -vif blacklist | mplayer -shuffle -playlist -
Run Code Online (Sandbox Code Playgroud)
blacklist当我有访客或我儿子在附近时,我宁愿忽略带有艺术家或歌曲名称的文本文件在哪里(很多脏话......:D)
当mplayer遇到该-字符时,它会禁用控制台输入。从手册页:
-noconsolecontrols
Prevent MPlayer from reading key events from standard input.
Useful when reading data from standard input. This is automatically
enabled when - is found on the command line. [snip]
Run Code Online (Sandbox Code Playgroud)
这阻止了我在文件中寻找和跳过个别歌曲。有趣的是,这适用于视频,因为视频窗口仍然接受通常的键盘输入。
我怎样才能恢复常规的控制台输入?我想避免使用临时文件,尽管这当然是最简单的解决方案。-slave并且-input似乎不适合并且尝试-consolecontroles不起作用。
在标准输入以外的文件描述符上输入输入。
find /some/path/ -type f | grep -vif blacklist |
mplayer -shuffle -playlist /dev/fd/3 3<&0 </dev/tty
Run Code Online (Sandbox Code Playgroud)
最后一行的解释:来自 grep 的数据进入标准输入,即文件描述符0。除了 shell 中的标准输入之外,没有办法通过管道传输到任何地方,但我们可以做一些额外的管道。首先,我们连线文件描述符3到哪里文件描述符0: 3<&0。然后,我们连接文件描述符0(即标准输入)到终端:</dev/tty。我们告诉 mplayer 从文件描述符 3 中读取播放列表;mplayer 需要一个文件名,所以我们传递它/dev/fd/3,当进程打开它时,它的行为就像那个进程中的文件描述符 3。
请注意,重定向的顺序很重要,如果您有错误的直觉,这会违反直觉。3<&0 </dev/tty已从 fd 0 之前读取的位置读取 fd 3,并且 fd 0 从/dev/tty. </dev/tty 3<&0将从中读取 fd 0 和 fd 3 /dev/tty。