Mic*_*nez 7 bash prompt stderr
我只是注意到默认情况下 bash 交互式 shell 会写入提示并将您键入的任何内容回显到文件描述符 2 (stderr)。这可以通过在 strace 中运行 bash 来验证。
这是什么原因?为什么它不将这些东西写入标准输出?
可以看到最初的 UNIX 版本 5-7 也在做同样的事情。( UFD output = 2;
http://minnie.tuhs.org/cgi-bin/utree.pl?file=V7/usr/src/cmd/sh/main??.c )
time
is/was 是一个内置函数,它输出到 stderr 绝对有用。但是time
不是 V5 中的内置函数之一。
我不认为有什么大的原因 不将终端输出写入 stderr。shell 的输出要么是明显的错误消息,要么是仅用于交互式终端的输出。没有必要重定向 stdout 来重定向交互式输出。
虽然stderr是在V6而不是V5中引入的,但在V5中sh
手动引入dup()
如果需要,在关闭旧的 FD 2 后stdout 输出到 FD 2。似乎他们已经发现需要打印错误消息,例如,如果exec()
在尝试启动类似foo > output
.
现在注意如何 历史unix代码是紧凑。它故意保持简短,因为不一定有很多物理 RAM。
有一个 prs()
函数可以打印字符串。它不接受 FD 参数。它将错误消息打印到 FD 2,其他字符串也可以打印到 FD 2,因此它只是无条件地打印到 FD 2。短代码,编译为很少的指令,因此使用最少的 RAM。
一旦事情发生了一段时间, 改变它们总是有破坏更多东西的风险。
让我感到困惑的是为什么 python 的开发人员甚至注意到这一点并复制了它 - IMO 这是一个非常模糊的事实。也许这暗示了我还没有找到的另一个原因。
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);
}
Run Code Online (Sandbox Code Playgroud)