печать в stderr не достигает stderr

Я пишу проект оболочки на C, и когда я пытаюсь написать в 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, error_message, strlen(error_message));
}

Мой вывод выглядит следующим образом:

An error has occurred
Raise error method is reached

Что я могу делать неправильно?


person PySerial Killer    schedule 21.02.2021    source источник
comment
Опубликуйте минимальный воспроизводимый пример.   -  person MikeCAT    schedule 21.02.2021


Ответы (1)


Я думаю, что вы перенаправляете свой вывод в файл, используя ›. Если вы делаете это, попробуйте изменить на этот пример команду › file 2›&1. Замените команду и файл соответственно. За более подробным объяснением обратитесь к https://linuxize.com/post/bash-redirect-stderr-stdout/

person Victor Gonzalez Chamorro    schedule 21.02.2021