Страница 1 из 1

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

Добавлено: 2008-09-16 16:00:47
mike345
Подскажите как сделать чтобы переменной $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:

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

Добавлено: 2008-09-16 16:02:46
zg

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

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

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

Добавлено: 2008-09-21 9:05:24
mike345
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
Как тоже самое сделать с помощью переменной?

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

Добавлено: 2008-09-21 10:55:29
zg

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

#!/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!"
Вопросы?

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

Добавлено: 2008-09-21 11:11:28
mike345
Yes!! :Yahoo!:
Спасибо, а то я уже всю голову сломал :smile:

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

Добавлено: 2008-09-21 11:32:26
zg
Нда... вопросов нет :smile: а жаль... задача не то, чтобы сильно сложная, но достаточно интересная... ну ладно, удачи :smile:

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

Добавлено: 2008-09-21 12:25:42
mike345
Вопросы наверняка появятся, и скоро :smile:

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

Добавлено: 2008-09-21 15:21:39
mike345
Ну вот и вопросик появился:
как на выходе получить файл сжатый gzip?
В предыдущих вариантах перенаправлял примерно так:

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

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

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

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

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

Добавлено: 2008-09-21 22:05:49
zg
через отдельую функцию

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

#!/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:

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

Добавлено: 2008-09-22 6:48:05
mike345
Спасибо. Еще вопросик.
Я так понимаю, обработка позиции вывода делается с помощью выражения

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

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

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

Добавлено: 2008-09-22 15:32:07
zg
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 задает абсолютные координаты курсора (строка, столбец)
цвета правда редко совпадают, но вот работа с курсором от и до. Но цвет я обычно методом тыка подбираю, всё никак не дойдут руки оформить в таблицу.

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

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

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

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

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

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

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

Добавлено: 2009-11-28 15:41:31
Dmitriy_K
В продолжение темы...
Извиняюсь, но как всё-таки присвоить переменной произвольный вывод команды, когда там часть выводится через 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`
Переменной ничего не присваивается. :(