私はこれについてしばらく頭を傷つけました。
- この答え:mpg123で「ようこそ」メッセージを抑制しますか?すべての出力を抑制したい場合にのみ、このケースに応答してください。
- この答え:https://stackoverflow.com/questions/50797724/cannot-capture-diagnostic-output-from-mpg123-while-the-program-is-running出力をファイルにリダイレクトし、そのファイルを読み取るソリューションが機能しないと思います。
- 最初の数行を削除するために、sed、awk、またはtailにパイプを接続するなどの明白な操作は機能しません(例:https://stackoverflow.com/questions/24542425/bash-how-to-remove-first-2-lines-from-output)
答え1
-C
パイプバッファリングがmpg123オプションに問題を引き起こすことがわかりました。この問題は--line-buffered
grepまたはsedのオプションを使用して解決できます-u
。
結局、私が使用したフラグセットは次のようになります。
mpg123 -Z -C --title */* 2>&1 | grep --line-buffered -Ev "High Performance|written and copyright by|without any warranty but with best wishes|Terminal control enabled|MPEG 1.0|Decoding of" | sed -uE 's/Playing MPEG stream [0-9]+ of [0-9]+: //' | sed -uE "s/Directory: //" | sed -uE "s/\.\.\.//" | sed -uE '/^\s*$/d'
オプションを段階的に見てみましょう。これらのいくつかは、便利なmpg123設定に関するより広範な質問に答えます。
-Z
これは永遠のランダムシャッフルです。-C
制御コマンドを許可--title
端末のタイトルを現在の曲のタイトルに変更*/*
現在のサブディレクトリでファイルを探します。ファイルが指定されたディレクトリにある場合は「*」で十分です。2>&1
標準エラー(mpg123が印刷する内容)からパイプを使用して実行できる標準出力にリダイレクト--line-buffered
grep と-u
sed のフラグはバッファリングを防ぎ、問題が発生しました。- 他のフラグは単なる正規表現スイッチであり、問題の核心ではありません。
次に、使いやすいようにコマンドにエイリアスを割り当てました。
alias pmr="clear; mpg123 -Z -C --title */* 2>&1 | grep --line-buffered -Ev 'High Performance|written and copyright by|without any warranty but with best wishes|Terminal control enabled|MPEG 1.0|Decoding of' | sed -uE 's/Playing MPEG stream [0-9]+ of [0-9]+: //' | sed -uE 's/Directory: //' | sed -uE 's/\.\.\.//' | sed -uE '/^\s*$/d'" ## pmr := play music recursively
tailには-f
バッファリングを防ぐためのフラグがありますが、引き続き問題が発生します。