Форум русскоязычного сообщества Ubuntu


Увидели сообщение с непонятной ссылкой, спам, непристойность или оскорбление?
Воспользуйтесь ссылкой «Сообщить модератору» рядом с сообщением!

Автор Тема: [Решено]Как перенаправить данные из потока ошибок в переменную?  (Прочитано 4693 раз)

0 Пользователей и 1 Гость просматривают эту тему.

Оффлайн ubuntar

  • Автор темы
  • Участник
  • *
  • Сообщений: 129
  • Qui quaerit, reperit
    • Просмотр профиля
Есть некая программа program,заведомо известно,что внутри неё производится запись строки в поток cerr.Необходимо перенаправить запись этой строки в переменную для последующего сравнения с шаблоном.В общих чертах что я пытаюсь набросать:
# !/bin/bash

exec "./program" #Вот тут нужно поймать строку из cerr,написанную программой и посадить её в str
if [str == "Шаблон ошибки"]
    then echo "Ok"
else echo "Some error"
fi
exit 0
Как правильно перенаправить данные из cerr в str?
« Последнее редактирование: 13 Августа 2009, 16:59:09 от ubuntar »

Оффлайн digiwhite

  • Активист
  • *
  • Сообщений: 732
  • http://www.welinux.ru
    • Просмотр профиля
    • http://www.welinux.ru
По идее перенаправить поток ошибок в стандартный поток вывода:
2>&1
Но вот чего-то в скрипте у меня записать в переменную его содержимое не получилось.
Социальная сеть не фанатично настроенных линуксойдов - http://www.welinux.ru

Оффлайн h0rr0rr_drag0n

  • Новичок
  • *
  • Сообщений: 23
    • Просмотр профиля
Например так ??
$TMP_ERNF="errno.tmp"
program_name 2 >  $TMP_ERNF
grep -q "Шаблон ошибки" $TMP_ERNF
if [ "$?" -eq 0 ]; then
    echo "Есть совпадение"
fi
rm -f $TMP_ERNF

Оффлайн ubuntar

  • Автор темы
  • Участник
  • *
  • Сообщений: 129
  • Qui quaerit, reperit
    • Просмотр профиля
Да,в принципе через файл я и сделал,а в строковую переменную не получилось.Спасибо. Пусть темка пока будет открытой,может,у кого-то всё же будет способ...

Оффлайн RandomNT

  • Любитель
  • *
  • Сообщений: 80
    • Просмотр профиля
str=$(./program 2>&1)

Оффлайн alexander.pronin

  • Старожил
  • *
  • Сообщений: 2539
    • Просмотр профиля
str=$(./program 2>&1)
Так данные будут смешаны (ошибочные и полезные).
По-видимому, если нужны только ошибки, то надо делать через промежуточный файл.
Или анализировать смесь в переменной.

Оффлайн RandomNT

  • Любитель
  • *
  • Сообщений: 80
    • Просмотр профиля
можно так
#!/bin/bash
#

mix=$(./program 2>&1)
err=$(./program 2>&1 1>/dev/null)
out=$(./program)

echo "mix:"
echo $mix
echo "err:"
echo $err
echo "out:"
echo $out

только чтобы с одного выполнения ./program заполнились две переменные $err и $out незнаю как сделать

Оффлайн alexander.pronin

  • Старожил
  • *
  • Сообщений: 2539
    • Просмотр профиля
err=$(./program 2>&1 1>/dev/null)
Это хорошая идея. Надо только проверить, не улетят ли ошибки за компанию в пустоту.

Оффлайн ubuntar

  • Автор темы
  • Участник
  • *
  • Сообщений: 129
  • Qui quaerit, reperit
    • Просмотр профиля
str=$(./program 2>&1)
Так данные будут смешаны (ошибочные и полезные).
По-видимому, если нужны только ошибки, то надо делать через промежуточный файл.
Или анализировать смесь в переменной.
Спасибо RandomNT!  Попробую  :) Как раз в моём случае данные не смешаются,так как это система тестирования,и заранее известен результат вывода программы,т.е. просто ожидаемый вывод сравнивается с шаблоном на соответствие.
« Последнее редактирование: 12 Августа 2009, 20:25:21 от ubuntar »

Оффлайн alexander.pronin

  • Старожил
  • *
  • Сообщений: 2539
    • Просмотр профиля
Сейчас проверил сомнения. Работает. Решпект RandomNT.

al@ubuntu-desktop1:~$ find ~ -name "1.odg"
find: `/home/al/.local/share/Trash/files': Permission denied
/home/al/1.odg
al@ubuntu-desktop1:~$ err11=$(find ~ -name "1.odg" 2>&1 1>/dev/null)
al@ubuntu-desktop1:~$ echo $err11
find: `/home/al/.local/share/Trash/files': Permission denied
al@ubuntu-desktop1:~$

 

Страница сгенерирована за 0.016 секунд. Запросов: 22.