Shell-Script
從標準輸入讀取時,如何在 mplayer 中保留控制台輸入?
我正在玩.
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/tty
fd 3 從 fd 0 之前讀取的位置讀取,fd 0 從/dev/tty
.</dev/tty 3<&0
將從中讀取 fd 0 和 fd 3/dev/tty
。