2016-02-24 4 views
0

Возможно ли продолжить трубку нормального stdout в другую программу, но сохранить stderr в переменную?Bash: Вывод stdout трубы и улавливание stderr в переменную

Это UseCase:

mysqldump database | gzip > database.sql 

В этом случае я хотел бы, чтобы поймать все ошибки/предупреждения, полученные mysqldump и хранить их в переменную, но нормальная stdout (что свалка) следует продолжать доводят до gzip.

Любые идеи о том, как это сделать?

+0

вы могли бы попытаться перенаправить поток 1 и 2 к различным направлениям и прочитать файл Stderr в вар – ritesht93

ответ

1

Вы могли бы сделать что-то вроде:

errors=$(mysqldump database 2>&1 > >(gzip > database.sql)) 

Здесь я использую замену процесса, чтобы получить gzip использовать выход mysqldump «S, как STDIN. Учитывая, что теперь для подстановки команд теперь используется stderr the order of redirections (2>&1 before >), mysqldump.

Тестирование это:

$ a=$(sh -c 'echo foo >&2; echo bar' 2>&1 > >(gzip > foo)) 
$ gunzip < foo 
bar 
$ echo $a 
foo 
+0

Можно ли также сохранить оба кода выхода и оба сообщения об ошибках ('mysqldump', а также' gzip'), чтобы я мог проверить их отдельно после? – lockdoc

+0

@lockdoc, не используя этот путь, я боюсь. Вы можете получить коды выхода mysqldump с помощью '$?', Но статус 'gzip' будет потерян. – muru

+0

OK спасибо за информацию! – lockdoc

3

Вы можете сделать следующее:

mysqldump database 2> dump_errors | gzip > database.sql 
error_var=$(cat dump_errors) 
rm dump_errors 

Здесь все ошибки по mysqldump перенаправляются в файл с именем «dump_errors», и стандартный вывод передается по конвейеру gzip, что, в свою очередь, пишет в database.sql.

Содержимое «dump_errors» затем присваивается переменной «error_val», а затем удаляется файл «dump_errors».


Обратите внимание на следующие переназначения:

$ sort 1> output 2> errors # redirects stdout to "output", stderr to "errors" 
$ sort 1> output 2>&1  # stderr goes to stdout, stdout writes to "output" 
$ sort 2> errors 1>&2  # stdout goes to stderr, stderr writes to "errors" 

$ sort 2>&1 > output   # tie stderr to screen, redirect stdout to "output" 
$ sort > output 2>&1   # redirect stdout to "output", tie stderr to "output" 
+0

возможно ли это без необходимости дополнительного файла? – lockdoc

+0

Проверьте решение muru. В общем случае, если вы хотите использовать каналы, то вы не можете создавать переменные в трубах, так как труба работает в подоболочке, а переменные не будут сохраняться после выхода, следовательно, необходимость в дополнительном файле. Но если вы не используете трубку, вы можете покончить с дополнительным файлом. – assefamaru

+0

Благодарим за дополнительную информацию. Тем не менее, я собираюсь принять ответ муру, поскольку он делает все без tmpfies. – lockdoc

Смежные вопросы