打印到标准错误未达到标准错误

问题描述

我正在用 C 编写一个“shell”项目,当我尝试写入 stderr(发生错误时)时,会打印消息 (stdout) 但输出字符串未到达 stderr(脚本对此进行测试,并且我们可以假设它有效)。

这就是我的脚本结构

int main(int argc,char * argv) {
    ...
    while(some_expression) {
        switch(other_expression) {
            ...
            case k:
                raise_error();
                break;
            ...
        }
    }
}

raise_error() 看起来像这样:

void raise_error() {
    char error_message[30] = "An error has occurred\n";
    write(STDERR_FILENO,error_message,strlen(error_message));
}

当我检查应包含错误消息(由测试脚本生成)的文件时,该文件为空,但错误消息出现在控制台输出 (stdout) 中。如果删除 main 中的所有内容,并只放入 raise_error(),则它可以正常工作,并且错误消息会出现在 stderr 文件中。我还用下一种方式修改了 raise_error() :

void raise_error() {
    printf("Raise error method is reached");
    char error_message[30] = "An error has occurred\n";
    write(STDERR_FILENO,strlen(error_message));
}

我的输出如下所示:

An error has occurred
Raise error method is reached

我可能做错了什么?

解决方法

我认为您正在使用“>”将输出重定向到文件。如果您正在这样做,请尝试更改为此示例“命令 > 文件 2>&1”。相应地替换命令和文件。有关更详细的说明,请参阅 https://linuxize.com/post/bash-redirect-stderr-stdout/