私はこの問題を明確にするように頼まれました。特定のプログラムの動作について尋ねるのではなく、私が尋ねる動作の例としてffmpegを使用しています。質問をもう一度言うと:
stdout
プログラムが別のプログラムにパイプされたときに端末出力を生成する方法。stderr
出力ストリームに関する限り、これは唯一のオプションですか?
元の質問:
私は、さまざまな電子製品とプログラミングの趣味をサポートするためにゆっくりとLinuxを学んでいるWindows開発者です。私はヘッドレスRaspberry Piを使用しているので、SSH端末を介してのみ対話します。実際、ターミナル出力はstdout
クラスを介して.NET Coreプログラムで開始されたサブプロセスを制御するとき、ターミナルProcess
出力は私のプログラムがストリームを傍受したときに受け取ることですstdout
。
しかし、ffmpegをVLCにパイプできるようにするには、bashを起動する必要があり、端末でこの操作を「手動で」実行すると、ffmpegがデータをVLCにパイプしている間に処理の詳細が端末に書き込まれることに気づきました。私はコマンドラインパイプがstdout
別のプログラムにリダイレクトされると思いましたstdin
。
stdin
bashに問題があります(私のプログラムからswitchで始まったプログラムにデータを渡していないようです)。したがって、2つのインスタンスを使用し、そのようにパイプを処理しようとしていbash -c "ffmpeg ... | cvlc ..."
ます。Process
だからふとターミナル出力とパイプ出力の関係、その後ろで何が起こっているのか気になった。
編集:この記事を書くとき、私は通常両方をキャプチャして出力し、そのクラスを使用することを忘れていstdout
ましstderr
たProcess
。stderr
私の経験ではほとんど使用されていないWindowsでは、stderr
エラーのない端末出力のためのUnixのルーチンになることはできますか?推測だけしてみると…
答え1
プログラムには、標準出力とは別に出力を送信する2つの方法があります。
1つは標準エラーとして出力することですが、これはおそらくWindowsよりUnixスタイルの環境で一般的です。進行状況レポート/ログ情報はstderrまたはstdoutに属していますか?これについて話し合いましょう。標準エラーはリダイレクトできます。シェルの制御およびリダイレクト演算子は何ですか?
もう1つは、を使用してプログラムが実行されている端末(ある場合)に直接出力することです/dev/tty
。ユーザーコマンドを読み取ることができますが、標準入力からデータを「少なく」取得する方法は何ですか?これについて議論してください(入力に関しては、同様の側面が出力にも適用されます)。
答え2
stderrとstdoutは、端末にテキストを出力する基本的な方法です。
出力をstderrとstdoutにリダイレクトするechoと関数を使用してください。
function multioutput(){
>&2 echo 'stderr output'
echo 'stdout output'
}
ffmpeg stderrをstdoutにリダイレクトして両方をvlc stdinにパイプするには:
2>&1 ffmpeg -arg1 -arg2|vlc
vlcが他のコマンドのテキスト出力を処理する方法は私次第です...
あなたの目標を説明するなら、あなたを助けてくれる幸運があるかもしれません。