質問: '>'がgccからのエラーメッセージをリダイレクトしないのはなぜですか? 次のプログラムをnew.cに保存しましたint main() { a; return 0; } エラーメッセージを返します。このメッセージをファイルに送信したいと思います。だから私は次のコマンドを使用しましたgcc new.c > temp.txt しかし、それでも私は端末で出力を取得していました。 ubuntu13.04を使用しています。どうすればそれを機能させることができますか?
回答: 他の人が言っているように、linuxは2つの異なる出力ストリームを提供します。stdout、または「標準出力」はすべての通常の出力が行われる場所です。 ファイル記述子1を使用して参照できます。stderr、または「標準エラー」は帯域外情報の個別のストリームです。 ファイル記述子2を使用して参照できます。なぜ2つの異なる出力ストリームなのですか?架空のコマンドのパイプラインについて考えてみましょう。 decrypt $my_file | grep "secret" | sort > secrets.txt ここで、decryptコマンドが失敗し、エラーメッセージが生成されると想像してください。そのメッセージをstdoutに送信した場合、パイプに送信され、「秘密」という単語がない限り、メッセージは表示されません。そのため、何が悪かったのかわからないまま、空の出力ファイルになってしまいます。ただし、パイプはstdoutのみをキャプチャするため、decryptコマンドはエラーをstderrに送信でき、そこでコンソールに表示されます。stdoutとstderrは、一緒に、または個別にリダイレクトできます。# send errors to "errors.txt" and output to "secrets.txt" # the following two lines are equivalent, as ">" means "1>" decrypt $my_file 2> errors.txt > secrets.txt decrypt $my_file 2> errors.txt 1> secrets.txt エラーをstdoutにリダイレクトして、通常の出力であるかのように処理できます。# the operation "2>&1" means "redirect file descriptor 2 to file # descriptor 1. so this sends all output from stderr to stdout. # note that the order of redirection is important. decrypt $my_file > errors.txt 2>&1 # this may be confusing. it will store the normal output in a file # and send error messages to stdout, where they'll be captured by # the pipe and then sorted. decrypt $my_file 2>&1 > output.txt | sort 「省略形」表記を使用して、両方のstdoutとstderrを同じファイルにリダイレクトすることもできます。decrypt $my_file &> output.txt そして最後に、>演算子は、出力ファイルに書き込む前に、まず出力ファイルを切り捨てします。代わりに、既存のファイルにデータを追加する場合は、>>演算子を使用します。decrypt $my_file 2>> more_errors.txt >> more_secrets.txt decrypt $my_file >> more_output.txt 2>&1