私はbashインタラクティブシェルがデフォルトでプロンプトに書き込んで、ファイル記述子2(stderr)に入力したものをエコーすることに気づきました。これはstraceでbashを実行することで確認できます。
その理由は何ですか?なぜこの内容を標準出力に書きませんか?
ベストアンサー1
もともとUNIXバージョン5-7も同じことをしていました。 (UFD output = 2;
http://minnie.tuhs.org/cgi-bin/utree.pl?file=V7/usr/src/cmd/sh/main.c)
time
確かに便利な stderr で出力する組み込み関数です。ただし、time
これはV5に組み込まれている機能の1つではありません。
大きな理由はないと思います。いいえ端末出力を stderr に書き込みます。シェルの出力は、明示的なエラーメッセージまたは対話型端末専用出力です。標準出力をリダイレクトして対話型出力をリダイレクトする必要はありません。
stderr は V5 ではなく V6 で導入されましたが、V5 ではsh
必要に応じて古い FD 2 を閉じてから手動で stdout を FD 2 に送信できます。失敗した同様のコマンドを実行しようとしたdup()
ときにエラーメッセージを印刷する必要性が見つかったようです。exec()
foo > output
今、方法を学びます。ポケット歴史的なUNIXコードは次のとおりです。物理RAMが必ずしも多い必要はないので、意図的に短く保たれた。
prs()
文字列を出力する関数があります。 FDパラメーターを使用しません。 FD 2にエラーメッセージを印刷し、他の文字列もFD 2に印刷できるため、無条件にFD 2にのみ印刷します。いくつかの命令でコンパイルされた短いコードなので、最小限のRAMを使用してください。
しばらく何が起こると、変化彼らは常に自分が改善するよりも多くを破る危険があります。
私を恥ずかしくさせるのは、Python開発者がこれを見つけてコピーした理由です。私の考えでは、やや曖昧な事実です。たぶんこれは私がまだ見つけていない別の理由を意味するかもしれません。
err(s)
char *s;
{
prs(s);
prs("\n");
if(promp == 0) {
seek(0, 0, 2);
exit();
}
}
prs(as)
char *as;
{
register char *s;
s = as;
while(*s)
putc(*s++);
}
putc(c)
{
write(2, &c, 1);
}