stdinから読むときにmplayerでコンソール入力を維持する方法は?

stdinから読むときに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効果がないようです。

ベストアンサー1

標準入力ではなくファイル記述子に入力を提供します。

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

最後の行の説明:grepのデータは標準入力から得られます。ファイル記述子0. シェルから標準入力以外のものにパイプする方法はありませんが、いくつかの追加のパイピングを実行できます。まず、ファイルディスクリプタ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<&0fd 0とfd 3は同時に読み取られます/dev/tty

おすすめ記事