为什么默认情况下 bash 交互式 shell 会写入其提示并将其交互式输入回显到 stderr?

Mic*_*nez 7 bash prompt stderr

我只是注意到默认情况下 bash 交互式 shell 会写入提示并将您键入的任何内容回显到文件描述符 2 (stderr)。这可以通过在 strace 中运行 bash 来验证。

这是什么原因?为什么它不将这些东西写入标准输出?

sou*_*edi 7

可以看到最初的 UNIX 版本 5-7 也在做同样的事情。( UFD output = 2; http://minnie.tuhs.org/cgi-bin/utree.pl?file=V7/usr/src/cmd/sh/main??.c )

timeis/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)