標準出力と標準エラーをファイルにリダイレクトする [重複]

標準出力と標準エラーをファイルにリダイレクトする [重複]

私はstdoutとstderrを同じファイルにリダイレクトする2つの方法があることを学びました。最初の方法は: ls -l /bin > ls-output.txt 2>&1 著者としてこの本状態:この方法を使用して2つのリダイレクトを実行します。まず、stdoutをls-output.txtにリダイレクトし、次にstderr(ファイル記述子2)をstdout(ファイル記述子1を使用)にリダイレクトします。

リダイレクトの順序が重要です。

ls -l /bin 2>&1 >ls-output.txtstderrを画面にリダイレクトします。

私の質問は:多くのプログラミング言語と同様に、コマンドは関連性と優先順位の規則を念頭に置いて設計されています。そして画面にコマンドを書きながら、どのようにコマンドを読みますか?そしてバックグラウンドでコマンドが実行される順序は何ですか?

実行順序について私が考える方法は次のとおりです。まず、コマンドはls -l /bin出力をstdoutに送信し、エラーはstderr(どちらか一方)に送信します。その後、stderrはstdoutにリダイレクトされます。 (エラーが発生した場合、例:ls -l /binn使用中の場合)現在、stdoutストリームには2つの(出力またはエラー)の1つが含まれてファイルにリダイレクトされます。ls-output.txt

答え1

リダイレクトは左から右に処理されます。実行時:

ls -l /bin >ls-output.txt 2>&1

内部的には、シェルはおおよそ次のことを行います。

fork(); // Then in the child process:
fd = open("ls-output.txt", O_WRONLY | O_CREAT | O_TRUNC, 0666);
dup2(fd, 1);
close(fd);
// 2>&1
dup2(1, 2);

次に、ls -l /binこれらの記述子添付ファイルを使用してコマンドを実行します。stdoutまずファイルにリダイレクトしたので、リダイレクトはそれをstderr継承します。

書きたい場合

ls -l /bin 2>&1 >ls-output.txt

作業順序が逆になります。

// 2>&1
dup2(1, 2);
// >ls-output.txt
fd = open("ls-output.txt", O_WRONLY | O_CREAT | O_TRUNC, 0666);
dup2(fd, 1);
close(fd);

これはおそらく端末であるstderrソースにリンクされます。stdoutその後、stdoutファイルにリダイレクトされます。これは効果がありませんstderr

関連情報