перенаправление вывода dd в переменную

Программирование на sh, быть может немного про альтернативные языки
Правила форума
Убедительная просьба юзать теги [code] при оформлении листингов.
Сообщения не оформленные должным образом имеют все шансы быть незамеченными.
Аватара пользователя
mike345
сержант
Сообщения: 170
Зарегистрирован: 2007-12-09 15:57:55

перенаправление вывода dd в переменную

Непрочитанное сообщение mike345 » 2008-09-16 16:00:47

Подскажите как сделать чтобы переменной $nfo передавался вывод dd при посыле ему сигнала INFO (для того чтобы $nfo впоследствии разобрать, обработать и вывести на консоль)?
Сейчас вывод идет на консоль, а переменная пуста :(

Код: Выделить всё

#!/bin/sh

PID=`pgrep dd`
if [ ! -z $PID ]; then echo "Process dd  already running (pid $PID)! Exiting..."; exit
fi

dd if=/dev/ad0s1a | gzip -1 > /var/tmp.ad0s1a2.gz & \
echo "Starting..."
sleep 2
PID=`pgrep dd`

progbar() {
sleep 2
PID=`pgrep dd` && \
nfo=`kill -INFO $PID`
#printf "\f${nfo}\r"
echo ------------
echo "nfo $nfo"
echo =========
}

while  [ ! -x "/proc/$PID" ]; do
progbar
done
echo END
Пока писал этот пост понял что

Код: Выделить всё

nfo=`kill -INFO $PID`
присваивает вывод команды kill, а не dd...
А что надо написать чтобы присваивалось то, что описано выше и на консоль dd ничего не выводил? :cz2:

Хостинговая компания Host-Food.ru
Хостинг HostFood.ru
 

Услуги хостинговой компании Host-Food.ru

Хостинг HostFood.ru

Тарифы на хостинг в России, от 12 рублей: https://www.host-food.ru/tariffs/hosting/
Тарифы на виртуальные сервера (VPS/VDS/KVM) в РФ, от 189 руб.: https://www.host-food.ru/tariffs/virtualny-server-vps/
Выделенные сервера, Россия, Москва, от 2000 рублей (HP Proliant G5, Intel Xeon E5430 (2.66GHz, Quad-Core, 12Mb), 8Gb RAM, 2x300Gb SAS HDD, P400i, 512Mb, BBU):
https://www.host-food.ru/tariffs/vydelennyi-server-ds/
Недорогие домены в популярных зонах: https://www.host-food.ru/domains/

zg
полковник
Сообщения: 5845
Зарегистрирован: 2007-12-07 13:51:33
Откуда: Верх-Нейвинск

Re: перенаправление вывода dd в переменную

Непрочитанное сообщение zg » 2008-09-16 16:02:46

Код: Выделить всё

info=`dd ... 2>&1`

Аватара пользователя
mike345
сержант
Сообщения: 170
Зарегистрирован: 2007-12-09 15:57:55

Re: перенаправление вывода dd в переменную

Непрочитанное сообщение mike345 » 2008-09-21 9:05:24

zg писал(а):

Код: Выделить всё

info=`dd ... 2>&1`
В этом случае либо выводятся сообщения dd на консоль (что не нужно), либо ждет до полной отработки dd, что тоже не то.
Нужно чтобы переодически во время работы dd обновлялось значение переменной, при этом на консоль ничего не выводилось и она была свободна для вывода прогрессбара.

Пока получилось только через промежуточный файл, но это не есть хорошо:

Код: Выделить всё

#!/bin/sh

PID=`pgrep dd`
if [ ! -z $PID ]; then echo "Process dd  already running (pid $PID)! Exiting..."; exit
fi
nfo=`dd if=/tmp/1.gz  2>out | gzip -1 > /var/11.gz &`
echo "Starting..."
sleep 1
PID=`pgrep dd`
progbar() {
PID=`pgrep dd`
`kill -INFO $PID 2>/dev/null`
sleep 1
str1=`cat out`
str="$(printf "${str1}" | sed -e 1d -e /records/d -e 's/bytes transferred in //' -e 's/secs (//' -e 's/bytes\/sec)//')"
# Здесь будет подсчет и вывод прогрессбара...
printf "${str}\r"
echo > out		
}
while  [ ! -x "/proc/$PID" ]; do
progbar
done
echo ""
echo END
Как тоже самое сделать с помощью переменной?

zg
полковник
Сообщения: 5845
Зарегистрирован: 2007-12-07 13:51:33
Откуда: Верх-Нейвинск

Re: перенаправление вывода dd в переменную

Непрочитанное сообщение zg » 2008-09-21 10:55:29

Код: Выделить всё

#!/bin/sh

IF=/dev/ad0
OF=/home/zg/1.bin
COUNT=400
BLOCK=1m

CMD="dd if=${IF} of=${OF} bs=${BLOCK} count=${COUNT}"

progress() {
  while read line; do
    if [ -n "`echo $line | grep transfe`" ]; then
      echo -e "\e[1FCopying: $line"
    fi
  done
}

echo '**********************'
echo "IF: ${IF}"
echo "OF: ${OF}"
echo "Block: ${BLOCK}"
echo "Count: ${COUNT}"
echo '**********************'
echo Copying:
echo -n "Please wait ... "

($CMD 2>&1 | progress) &

while true; do
  sleep 1
  PID=`pgrep dd`
  if [ -z "${PID}" ]; then break; fi
  kill -INFO ${PID}
done

wait

echo "Operation complete!"
Вопросы?

Аватара пользователя
mike345
сержант
Сообщения: 170
Зарегистрирован: 2007-12-09 15:57:55

Re: перенаправление вывода dd в переменную

Непрочитанное сообщение mike345 » 2008-09-21 11:11:28

Yes!! :Yahoo!:
Спасибо, а то я уже всю голову сломал :smile:

zg
полковник
Сообщения: 5845
Зарегистрирован: 2007-12-07 13:51:33
Откуда: Верх-Нейвинск

Re: перенаправление вывода dd в переменную

Непрочитанное сообщение zg » 2008-09-21 11:32:26

Нда... вопросов нет :smile: а жаль... задача не то, чтобы сильно сложная, но достаточно интересная... ну ладно, удачи :smile:

Аватара пользователя
mike345
сержант
Сообщения: 170
Зарегистрирован: 2007-12-09 15:57:55

Re: перенаправление вывода dd в переменную

Непрочитанное сообщение mike345 » 2008-09-21 12:25:42

Вопросы наверняка появятся, и скоро :smile:

Аватара пользователя
mike345
сержант
Сообщения: 170
Зарегистрирован: 2007-12-09 15:57:55

Re: перенаправление вывода dd в переменную

Непрочитанное сообщение mike345 » 2008-09-21 15:21:39

Ну вот и вопросик появился:
как на выходе получить файл сжатый gzip?
В предыдущих вариантах перенаправлял примерно так:

Код: Выделить всё

dd if=file | gzip > file1
А тут пайп связан с progress...

Код: Выделить всё

($CMD 2>&1 | progress) &
Как в этом случае перенаправить dd на gzip?
Что-то никак не получается :(

zg
полковник
Сообщения: 5845
Зарегистрирован: 2007-12-07 13:51:33
Откуда: Верх-Нейвинск

Re: перенаправление вывода dd в переменную

Непрочитанное сообщение zg » 2008-09-21 22:05:49

через отдельую функцию

Код: Выделить всё

#!/bin/sh

IF=/dev/ad0
OF=/home/zg/1.bin
COUNT=20
BLOCK=1m

CMD="dd if=${IF} bs=${BLOCK} count=${COUNT}"

progress() {
  while read line; do
    if [ -n "`echo $line | grep transfe`" ]; then
      echo -e "\e[1FCopying: $line"
    fi
  done
}

backup() {
  $CMD | bzip2 > ${OF}
}

echo '**********************'
echo "IF: ${IF}"
echo "OF: ${OF}"
echo "Block: ${BLOCK}"
echo "Count: ${COUNT}"
echo '**********************'
echo Copying:
echo -n "Please wait ... "

( backup 2>&1 | progress ) &

while true; do
  sleep 1
  PID=`pgrep dd`
  if [ -z "${PID}" ]; then break; fi
  kill -INFO ${PID}
done

wait

echo "Operation complete!"
правда я поставил bzip2, но в целом примерно так :smile:

Аватара пользователя
mike345
сержант
Сообщения: 170
Зарегистрирован: 2007-12-09 15:57:55

Re: перенаправление вывода dd в переменную

Непрочитанное сообщение mike345 » 2008-09-22 6:48:05

Спасибо. Еще вопросик.
Я так понимаю, обработка позиции вывода делается с помощью выражения

Код: Выделить всё

echo -e "\e[1F..."
Можно поподробнее, что это и где об этом почитать? (man echo смотрел, там ничего об этом нет. Там описывается только ключ -n)

zg
полковник
Сообщения: 5845
Зарегистрирован: 2007-12-07 13:51:33
Откуда: Верх-Нейвинск

Re: перенаправление вывода dd в переменную

Непрочитанное сообщение zg » 2008-09-22 15:32:07

mike345 писал(а): Я так понимаю, обработка позиции вывода делается с помощью выражения

Код: Выделить всё

echo -e "\e[1F..."
Можно поподробнее, что это и где об этом почитать?
Оооо, друг! это секретнейшая информация, которая передаётся из уст в уста, от поколения к поколению!! Только избранным дано её узреть!...
Такие вот выводы напрашиваются после того, как погуглишь этот вопрос.. под фрю мне так и не удалось найти верную таблицу кодов, но зато нашёл под линукс :-D Привожу отрывок из статьи, который криво работает и во фре
Управление консолью Linux
Автор: (C) Алексей Мичурин
....
Управление цветом
\033[0m все атрибуты по умолчанию
\033[1m жирный шрифт (интенсивный цвет)
\033[2m полу яркий цвет (тёмно-серый, независимо от цвета)
\033[4m выделение (ярко-белый, независимо от цвета)
\033[5m мигающий
\033[7m реверсия (знаки приобретают цвет фона, а фон -- цвет знаков)
\033[22m установить нормальную интенсивность
\033[24m отменить подчеркивание
\033[25m отменить мигание
\033[27m отменить реверсию
\033[30 чёрный цвет знаков
\033[31 красный цвет знаков
\033[32 зелёный цвет знаков
\033[33 коричневый цвет знаков
\033[34 синий цвет знаков
\033[35 фиолетовый цвет знаков
\033[36 цвет морской волны знаков
\033[37 серый цвет знаков
\033[40 чёрный цвет фона
\033[41 красный цвет фона
\033[42 зелёный цвет фона
\033[43 коричневый цвет фона
\033[44 синий цвет фона
\033[45 фиолетовый цвет фона
\033[46 цвет морской волны фона
\033[47 серый цвет фона

Управление положением курсора
\033[#A передвинуть курсор вверх на # строк
\033[#B передвинуть курсор вниз на # строк
\033[#С передвинуть курсор вправо на # столбцов
\033[#D передвинуть курсор влево на # столбцов
\033[#E передвинуть курсор вниз на # строк и поставить в начало строки
\033[#F передвинуть курсор вверх на # строк и поставить в начало строки
\033[#G переместить курсор в указанный столбец текущей строки
\033[#;#H задает абсолютные координаты курсора (строка, столбец)
цвета правда редко совпадают, но вот работа с курсором от и до. Но цвет я обычно методом тыка подбираю, всё никак не дойдут руки оформить в таблицу.

Аватара пользователя
mike345
сержант
Сообщения: 170
Зарегистрирован: 2007-12-09 15:57:55

Re: перенаправление вывода dd в переменную

Непрочитанное сообщение mike345 » 2008-09-22 16:21:30

zg писал(а): Оооо, друг! это секретнейшая информация, которая передаётся из уст в уста, от поколения к поколению!! Только избранным дано её узреть!...
Такие вот выводы напрашиваются после того, как погуглишь этот вопрос..
:smile: :smile: :smile:

Ну гугл на запросы \e[1F, "\e[1F", и даже \e[#F выдает полнейший бред :smile: :smile: :smile:
А сформулировать как то иначе не догадался я...

pol
проходил мимо

Re: перенаправление вывода dd в переменную

Непрочитанное сообщение pol » 2009-11-10 14:52:25

zg писал(а):Оооо, друг! это секретнейшая информация, которая передаётся из уст в уста, от поколения к поколению!! Только избранным дано её узреть!...
:smile:

man 5 termcap | grep cursor_
и
tset -IS | tr ':' '\n' | egrep ^up

Dmitriy_K
сержант
Сообщения: 200
Зарегистрирован: 2009-04-07 6:22:33
Откуда: г.Королёв

Re: перенаправление вывода dd в переменную

Непрочитанное сообщение Dmitriy_K » 2009-11-28 15:41:31

В продолжение темы...
Извиняюсь, но как всё-таки присвоить переменной произвольный вывод команды, когда там часть выводится через stderr как сообщение об ошибке.
Допустим, нужно присвоить переменной такой вывод команды:

Код: Выделить всё

# ./pf-flush_1.sh
No ALTQ support in kernel
ALTQ related functions disabled
0 addresses deleted.
Если прописать:

Код: Выделить всё

FLUSH_RES=`/sbin/pfctl -t ddos -vT flush`
Переменной ничего не присваивается. :(