BASH: сообщение об ошибке не перенаправляется в файл - PullRequest
2 голосов
/ 28 августа 2009

У меня есть скрипт bash, который просто вызывает разные вызовы и перенаправляет вывод stdout и stderr в разные файлы.

Я сделал это:

command 1> datafile 2>> errorfile

Однако, когда команда ошибочна (например, неправильная комбинация имени пользователя и пароля, заданных в качестве аргументов), сообщение об ошибке не перенаправляется в файл ошибок. Я все еще вижу сообщение об ошибке на моем экране, когда я запускаю этот скрипт. Например, сообщение об ошибке указывает на то, что я неправильно указал имя пользователя и пароль.

Что я делаю не так? Я думал, что не должен видеть вывод на экране, потому что я перенаправляю как stdout, так и stderr в файлы.

Ответы [ 3 ]

6 голосов
/ 28 августа 2009

Возможно, программа не пишет в stderr, а непосредственно открывает / dev / tty для связи с пользователем? Этот подход довольно распространен, когда дело доходит до взаимодействия с паролем: программное обеспечение хочет, чтобы запросы пароля проходили до пользователя, несмотря на любые перенаправления.

Если это так, вам нужен псевдотерминальный трюк, чтобы организовать вывод в файл.

Если у вас нет источника программного обеспечения, вы можете использовать strace / truss, чтобы узнать, что на самом деле делает программа.

0 голосов
/ 28 августа 2009

Похоже, у вас есть дополнительное '>' в вашем перенаправлении stderr. Попробуйте:

command 1> datafile 2> errorfile

Редактировать: Как было отмечено в комментариях, 2 >> перенаправляет stderr, добавляя в файл, тогда как 2> перезаписывает файл.

Я держу этот ответ на месте для справочных целей.

0 голосов
/ 28 августа 2009

Ваша команда перенаправления неверна. С bash, попробуйте это:

$ cat redir.c
#include <stdio.h>

int main(void) {
        fprintf(stdout, "Hello stdout\n");
        fprintf(stderr, "Hello stderr\n");
}
$ ./redir > txt 2>&1
$ cat txt
Hello stderr
Hello stdout
$ 

Клавиша '2> & 1' также используется для захвата stderr.

...