私は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.txt
stderrを画面にリダイレクトします。
私の質問は:多くのプログラミング言語と同様に、コマンドは関連性と優先順位の規則を念頭に置いて設計されています。そして画面にコマンドを書きながら、どのようにコマンドを読みますか?そしてバックグラウンドでコマンドが実行される順序は何ですか?
実行順序について私が考える方法は次のとおりです。まず、コマンドは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
。