Shell-Script

從標準輸入讀取時,如何在 mplayer 中保留控制台輸入?

  • October 29, 2018

正在玩. mplayer我想用以下方式編寫腳本

find /some/path/ -type f | grep -vif blacklist | mplayer -shuffle -playlist -

當我有訪客或我兒子在附近時,我寧願忽略藝術家或歌曲名稱的文本文件在哪裡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]

這阻止了我在文件中查找和跳過個別歌曲。有趣的是,這適用於影片,因為影片視窗仍然接受通常的鍵盤輸入。

如何恢復正常控制台輸入?我想避免使用臨時文件,儘管這當然是最簡單的解決方案。-slave並且-input似乎不適合併且嘗試-consolecontroles不起作用。

將輸入提供給標準輸入以外的文件描述符。

find /some/path/ -type f | grep -vif blacklist |
mplayer -shuffle -playlist /dev/fd/3 3<&0 </dev/tty

最後一行的解釋:來自 grep 的數據來自標準輸入,即文件描述符0。除了 shell 中的標準輸入之外,無法通過管道傳輸到任何地方,但我們可以做一些額外的管道。首先,我們將文件描述符 3 連接到文件描述符 0 所在的位置:3<&0. 然後我們將文件描述符 0(即標準輸入)連接到終端:</dev/tty. 我們告訴 mplayer 從文件描述符 3 中讀取播放列表;mplayer 需要一個文件名,所以我們傳遞它/dev/fd/3,當一個程序打開它時,它的行為就像那個程序中的文件描述符 3 一樣。

請注意,重定向的順序很重要,如果您的直覺錯誤,則違反直覺。3<&0 </dev/ttyfd 3 從 fd 0 之前讀取的位置讀取,fd 0 從/dev/tty. </dev/tty 3<&0將從中讀取 fd 0 和 fd 3 /dev/tty

引用自:https://unix.stackexchange.com/questions/30367