Консультация № 186024
14.05.2012, 11:44
99.51 руб.
0 7 1
Здравствуйте! У меня возникли сложности, прошу Вас помочь с таким вопросом( если можно, то с комментариями ) :
Задание :

Написать shell-процедуру, которая выполняет действия:
читает содержимое файла, передаваемого в качестве первого параметра;
записывает через каждые 5 с в файл, имя которого передается в качестве второго
параметра, попеременно строки из первого файла и текущее время и дату;
выводит на экран каждые 7 с текущее содержимое второго файла;
при вводе с клавиатуры слова quit удаляет второй файл и завершает работу.

Заранее спасибо!

Обсуждение

Неизвестный
14.05.2012, 14:51
общий
Как-то так наверное. Проверяйте.
Код:
while read a ; do sleep 5 ; echo "$a" ; sleep 5 ; date ; done >"$2" <"$1" & pa=$! ; while sleep 7 ; do cat "$2" ; done & pb=$! ; while read x ; [ m"$x" != mquit ] ; do : ; done ; kill $pa ; kill $pb ; rm "$2"
Неизвестный
15.05.2012, 01:40
общий
это ответ
Здравствуйте, Никулин Михаил!
Код:
#!/bin/bash

# Информация об использовании
usage()
{
echo "Usage: $( basename "$0" ) <infile> <outfile>"
exit 1
}

# Должно быть 2 параметра
if [[ $# -ne 2 ]] ; then
usage
fi

# Имена файлов
infile="$1"
outfile="$2"

# Записывает каждые 5сек 1й файл во 2й
writeproc()
{
while true ; do
read -r str ; rc=$?
echo "$str"
date
[[ $rc -ne 0 ]] && break
sleep 5
done <$infile >$outfile
}

# Выводит каждые 7сек 2й файл
checkproc()
{
while true ; do
cat "$outfile"
sleep 7
done
}

# Обработка выхода
exitproc()
{
# Удалить файл
rm "$outfile" >/dev/null
# Завершить группу процессов
kill -9 -$$ >/dev/null
}

# Ловим сигналы
trap exitproc INT TERM QUIT EXIT HUP ABRT

# Запуск фоновых процессов
writeproc &
checkproc &

# Читаем ввод пользователя
while read ; do
# Если quit то завершить цикл
[[ "$REPLY". == "quit". ]] && break
done

exitproc
Неизвестный
15.05.2012, 01:48
общий
Что означает конкретно:
попеременно строки из первого файла и текущее время и дату;


1) Все строки файла, а потом дату и т.д.
2) 1 стока и дата и т.д. (в этом случае, что делать когда строки закончатся?)
Неизвестный
15.05.2012, 02:49
общий
спасибо Вам за представленные решения, но у меня возник вопрос . В задание сказано :
записывает через каждые 5 с в файл, имя которого передается в качестве второго
параметра, попеременно строки из первого файла и текущее время и дату;

Я так понимаю что попеременно значит по очереди .
(т.е. первую строку потом вторую и тд)
файл 1
1111
2222
3333
4444

файл 2
1111
(дата)
2222
(дата)
и тд

vladisslav осуществил реализацию верно. Micren не могли бы изменить в сделанной Вами программе данный пункт пожалуйста.

Заранее спасибо.
Неизвестный
15.05.2012, 03:42
общий
я так понял что после ввода всех строк будет обновление каждые 7 сек содержимого файла №2.

я изменил процедуру записи вот что получилось
#!/bin/bash
# Информация об использовании
usage()
{
echo "Usage: $( basename "$0" ) <infile> <outfile>"
exit 1
}
# Должно быть 2 параметра
if [[ $# -ne 2 ]] ; then
usage
fi
# Имена файлов
infile="$1"
outfile="$2"
# Записывает каждые 5сек 1й файл во 2й
writeproc()
{
while read a; do
sleep 5
echo "$a"
#cat "$infile"
date
#sleep 5
#done >> $outfile
done > $outfile < $infile & pa=$!
}
# Выводит каждые 7сек 2й файл
checkproc()
{
while true ; do
cat "$outfile"
sleep 7
done
}
# Обработка выхода
exitproc()
{
# Завершить фоновые процессы
kill -SIGTERM "$p1" "$p2" >/dev/null
# Удалить файл
rm "$outfile" >/dev/null
exit
}
# Ловим сигналы 1,2,3,15
trap exitproc SIGHUP SIGINT SIGQUIT SIGTERM
# Запуск фоновых процессов
writeproc & p1="$!" # Сохраним PID
checkproc & p2="$!" # Сохраним PID
# Читаем ввод пользователя
while read ; do
# Если quit то завершить цикл
[[ "$REPLY". == "quit". ]] && break
done
exitproc
Неизвестный
15.05.2012, 10:11
общий
Код:
#!/bin/bash

# Информация об использовании
usage()
{
echo "Usage: $( basename "$0" ) <infile> <outfile>"
exit 1
}

# Должно быть 2 параметра
if [[ $# -ne 2 ]] ; then
usage
fi

# Имена файлов
infile="$1"
outfile="$2"

# Записывает каждые 5сек 1й файл во 2й
writeproc()
{
while true ; do
read -r str ; rc=$?
echo "$str"
date
[[ $rc -ne 0 ]] && break
sleep 5
done <$infile >$outfile
}

# Выводит каждые 7сек 2й файл
checkproc()
{
while true ; do
cat "$outfile"
sleep 7
done
}

# Обработка выхода
exitproc()
{
# Удалить файл
rm "$outfile" >/dev/null
# Завершить группу процессов
kill -9 -$$ >/dev/null
}

# Ловим сигналы
trap exitproc INT TERM QUIT EXIT HUP ABRT

# Запуск фоновых процессов
writeproc &
checkproc &

# Читаем ввод пользователя
while read ; do
# Если quit то завершить цикл
[[ "$REPLY". == "quit". ]] && break
done

exitproc
Неизвестный
16.05.2012, 01:37
общий
Спасибо Вам! Все отлично работает!
Форма ответа