2017-03-24 10 views
1

私はbashの機能は次のように定義されていますbash関数で複数のプログラムからstdoutを取り込む方法は?

$ test file.cpp 

compile OUTPUT 
simulate OUTPUT 

が、私はそうのような出力をリダイレクトできるようにしたいと思います:

$ test() { ./compile $1 ${1::-4}.output; ./simulate < ${1::-4}.output; } 

この機能を実行する私は端末に期待する出力を生成します。

$ test file.cpp > out_file.txt 

か:

$ test file.cpp | less 

しかし、私はstd出力をキャプチャしようとすると、またはそれを以下に配管しようとすると、私はstdoutをコンパイルから取り込み、シミュレートからのstdoutは端末にも出力されません。

実行されているすべてのプログラムからstdoutをキャプチャするにはどうすればよいですか?

+2

あなたは 'simulate'がstderrに書いていませんか? 'simder 2> stderr.txt'を実行すると、' stderr.txt'には何が入っていますか? – Jens

+0

これを実行しても入力は取得されません。それはターミナルにすべてを印刷しますか? –

+0

すみません。私は出力を言うことを意味しました。私はこれがセグメンテーションがある前にバッファーが空にならないという結果だと思いますか? –

答えて

0

simulateの出力がキャプチャされない場合、simulateはstdoutに書き込まれません。おそらくそれはstderrに書きます。あなたはとの両方をキャプチャすることができます(。あなたはおそらく別の名前を使用する必要がありますのでtestは、システムコマンドである、ところで)

test file.cpp &> out_file.txt 
test file.cpp 2>&1 | less 

+0

Hmm。だから 'test file.cpp&> out_file.txt'はstdoutを出力しますが、stdinputは出力しません。さらに、 'test file.cpp 2>&1 |第1のプログラムからの出力のみを出力する。明らかに、出力をシミュレートする方法には何か問題がありますが、C言語で書かれていてprintf()のみを使用していますか? –

+0

おそらく、 '/ dev/tty'や'/dev/console'に書いているのかも知れません。 'strace'を使ってどこに書き込んでいるか見ることができます。 –

+0

ああ私のゴシック。私はとても恥ずかしいです。私のエラーはsegfaultだったので、リダイレクトしていたときにバッファが終了する前にバッファが印刷されていなかった。私の前のコメントでは、私も誤解して、私が 'stderr'と言うときに' stdout'と、 'stdout'を意味するときに' stdinput'と言った。 –

関連する問題