BASH: сообщение об ошибке не перенаправляется в файл

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

Я сделал это:

command 1> datafile 2>> errorfile

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

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


person codingbear    schedule 27.08.2009    source источник
comment
Это на самом деле отлично работает для меня. Я создал foo, но не bar, запустил ls foo bar 1> data 2>> error и получил желаемые результаты. Какую версию Баша вы используете?   -  person Cascabel    schedule 28.08.2009


Ответы (3)


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

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

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

person Martin v. Löwis    schedule 27.08.2009
comment
Не могли бы вы рассказать подробнее? - person Davide; 30.10.2010
comment
Что конкретно вы хотите узнать? Вопрос был задан более года назад, так что, возможно, вам лучше задать новый, конкретный вопрос. - person Martin v. Löwis; 30.10.2010
comment
Хорошо, посмотрите, есть ли у вас ответ: stackoverflow.com/questions/4056075/ - person Davide; 30.10.2010

Ваша команда перенаправления неверна. С 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.

person Dirk Eddelbuettel    schedule 27.08.2009
comment
Более четкая версия вашего предложения: command > datafile 2>&1 >> errorfile - person Cascabel; 28.08.2009
comment
@bcat: я исправлен. Я неправильно прочитал вопрос - обычно я хочу, чтобы stdout и stderr находились в одном файле, что я и показал. Чего не спрашивали. Упс. - person Dirk Eddelbuettel; 28.08.2009
comment
@Jefromi: если я сделаю все, что вы сказали, файл данных НИЧЕГО не получит. Вот почему я изменил команду, как указано выше (мой вопрос). - person codingbear; 28.08.2009
comment
@bLee: Тогда ответ Мартина против Лёвиса звучит наиболее вероятно. Я просто с подозрением отнесся к сокращению 2›› (на самом деле без веской причины). - person Cascabel; 28.08.2009

Похоже, у вас есть лишний «>» в ​​перенаправлении stderr. Пытаться:

command 1> datafile 2> errorfile

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

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

person Community    schedule 27.08.2009
comment
ну, это было для добавления. Если у меня есть ›, то каждый раз будет создаваться новый файл ошибок. - person codingbear; 28.08.2009
comment
@bLee: Дох! Ты прав. Вот что я получаю за ответ по пути из офиса. Будет редактировать. - person PTBNL; 28.08.2009