Что-то я подумал, что сайтов с заботливо структурированными учебными материалами куча, а в итоге никто ничего не знает, что где. Раньше был фдс-нет, где те же ссылки были, но теперь его нет. Посему, пусть у меня полежит, коли кто-то на порносайтик да заходит.
Собственно, сабж. Писал по памяти, так что много чего нет (забылось с годами). Если кто ещё что помнит — дополняйте.
Да, ешё практически перед самой смертью на фдс-нете выкладывалась подборка ботвы. Если кому надо, могу её захостить, только дайте, откуда её скачать.
Собственно, сабж. Писал по памяти, так что много чего нет (забылось с годами). Если кто ещё что помнит — дополняйте.
Да, ешё практически перед самой смертью на фдс-нете выкладывалась подборка ботвы. Если кому надо, могу её захостить, только дайте, откуда её скачать.
Вероятно, многие знают, что при помощи shell built-in read можно построчно читать всякое; особенно это актуально при считывании списка файлов, которые потенциально могут содержать пробелы (например, в выдаче ls или find) или чего-то подобного. Обычно это делается так:
Построчное чтение из файла:
Построчное чтение результата выполнения команды (вариант с перенаправлением):
Вроде бы всё хорошо. Проблемы могут начаться в случае, когда во время чтения нужно изменять значения переменных. А именно, последний (и, кстати, наиболее часто используемый в случае, когда нужно обработать вывод команды, а не читать из файла) вариант приводит к созданию дочернего процесса (pipe же!), что приводит к тому, что все изменения переменных внутри тела цикла выполняются в подпроцессе и, как следствие, на процессе, в котором выполняется скрипт, не попадают. Это можно легко увидеть на следующем примере:
Обойти эту проблему можно несколькими способами. Один из них — использовать heredoc:
Очевидный недостаток этого решения — прежде, чем результат выполнения будет передан в цикл, он полностью будет получен. Это можно попытаться обойти, например, путём создания временного FIFO-файла:
Но всё же ощущается неаккуратность в виде наличия временных файлов. Тем более, что упражнение вида mktemp—rm—mkfifo теоретически может породить рейс. Можно попробовать соорудить конструкцию с созданием дескрипторов (like, exec 3<&0>&1):
И, казалось бы, счастье есть: мы можем запихать произвольный пайплайн из процессов в этот дескриптор, а потом читать из него (или с помощью специального ключика у read, как в примере выше, или же просто <&3. Осталась одна маленькая проблема: если попытаться прибить скрипт до окончания его работы, то это ему ничуть не помешает. Посему, нужно повесить trap, который убивает дочерний процесс и завершает работу:
Более аккуратного варианта как-то в голову не пришло. Если кто знает — поделитесь.
UPD. Таки приведённый вариант с дескрипторами работает только в zsh (не в dash). Буду думать, как его таки заимплементить.
Построчное чтение из файла:
while read line do # code done < file
Построчное чтение результата выполнения команды (вариант с перенаправлением):
ls | while read line do # code done
Вроде бы всё хорошо. Проблемы могут начаться в случае, когда во время чтения нужно изменять значения переменных. А именно, последний (и, кстати, наиболее часто используемый в случае, когда нужно обработать вывод команды, а не читать из файла) вариант приводит к созданию дочернего процесса (pipe же!), что приводит к тому, что все изменения переменных внутри тела цикла выполняются в подпроцессе и, как следствие, на процессе, в котором выполняется скрипт, не попадают. Это можно легко увидеть на следующем примере:
i=0; seq 1 3| while read line; do i=$(( $i + 1 )); done; echo $iВ bash и dash в результате будет выдан 0, в zsh и ksh (которые исполняют последний элемент пайплайна в текущем процессе в случае, если это shell built-in) — 3.
Обойти эту проблему можно несколькими способами. Один из них — использовать heredoc:
while read a b do i=$(( $i + 1 )) done <<EOF `seq 1 3 | sed 's/^/1 /'` EOF echo $iПри этом, как можно видеть из примера выше, можно использовать произвольный пайплайн.
Очевидный недостаток этого решения — прежде, чем результат выполнения будет передан в цикл, он полностью будет получен. Это можно попытаться обойти, например, путём создания временного FIFO-файла:
fifofile=`mktemp` rm "$fifofile" mkfifo "$fifofile" ls | sed 's/^/1 /' > "$fifofile" & # random command which output we need to parse while read a b do i=$(( $i + 1 )) done < "$fifofile" echo $i rm "$fifofile"Очевидно, что в данном случае строчка rm "$fifofile" будет выполнена после завершения цикла, что, по идее (так как read ждёт закрытия потока ввода), произойдёт только после завершения процесса, пишущего в FIFO и считывания из него всех данных.
Но всё же ощущается неаккуратность в виде наличия временных файлов. Тем более, что упражнение вида mktemp—rm—mkfifo теоретически может породить рейс. Можно попробовать соорудить конструкцию с созданием дескрипторов (like, exec 3<&0>&1):
exec 3<&0>&1 ls | sed 's/^/1 /' >&3 & # random command which output we need to parse while read -u 3 a b do i=$(( $i + 1 )) done echo $i exec 3<&->&-
И, казалось бы, счастье есть: мы можем запихать произвольный пайплайн из процессов в этот дескриптор, а потом читать из него (или с помощью специального ключика у read, как в примере выше, или же просто <&3. Осталась одна маленькая проблема: если попытаться прибить скрипт до окончания его работы, то это ему ничуть не помешает. Посему, нужно повесить trap, который убивает дочерний процесс и завершает работу:
trap 'kill -9 $cpid; exit' TERM INT exec 3<&0>&1 ls | sed 's/^/1 /' >&3 & # random command which output we need to parse cpid=$! while read -u 3 a b do i=$(( $i + 1 )) done echo $i exec 3<&->&-
Более аккуратного варианта как-то в голову не пришло. Если кто знает — поделитесь.
UPD. Таки приведённый вариант с дескрипторами работает только в zsh (не в dash). Буду думать, как его таки заимплементить.
Вышел MoinMoin 1.9.2
Mar. 1st, 2010 08:44 am
Появилась новая версия кросс-платформенного вики-сервера, написанного на языке Python — MoinMoin 1.9.2. В данной версии исправлен ряд серьёзных проблем с безопасностью, потенциально существовавших и в более старых ветках (начиная с 1.5). Разработчиками настоятельно рекомендуется обновиться до данной версии (или до версии 1.8.7, если обновление до ветки 1.9 невозможно или нежелательно по тем или иным причинам).
Ссылки:
Переславль 2010
Feb. 3rd, 2010 05:30 am
Не буду ничего писать про конференцию: всю неделю до неё хронически недосыпал, да и на ней самой отдохнуть не удалось, нормально смог отоспаться только по приезду. Никаких остаточных впечатлений посему не наблюдается.
( Немного быдлофоточек )
Многие почему-то так боятся того, что априори считают сложным. «Я не хочу учить матан, это сложно», «Я не хочу собирать модуль ядра, это сложно», «Я не буду читать "Искусство программирования", это сложно». Обычно подобные заявления делаются людьми, которые даже и не пытались это сложное сделать. И подобные заявления позволяют им не пытаться дальше. В то же время, большинство вещей, которые кажутся сложными, на самом деле таковыми не являются. Не все, но большинство. Но для того, чтобы выяснить, что сложно, а что — нет, нужно сначала попытаться это сделать. И не в духе «я погуглил, увидел хавту на стопицот страниц и забил» — объём не показатель сложности, а действительно попытаться. Разбираться с вещами, которые не получаются. Думать, там. Обычно, в итоге оказывается, что единственным препятствием были нежелание, лень и необходимость некоторого количества времени (заметим, что про собственно сложность тут ничего нет). И тогда вещи, которые ранее были названы сложными, в худшем случае оказываются громоздкими. Не более.
Я не утверждаю, что сложных вещей нет, их есть, и много. Но гораздо меньше, чем думают многие. И это ложное представление ограничивает этих многих в развитии. И это печально.
Я не утверждаю, что сложных вещей нет, их есть, и много. Но гораздо меньше, чем думают многие. И это ложное представление ограничивает этих многих в развитии. И это печально.
Быдлофоточке отакуэ
Jan. 2nd, 2010 10:41 pmВ этот раз как-то особенно отчётливо ощутил, что не понимаю, зачем радоваться смене циферок в такой искусственной вещи, как календарь. Ну, то есть, если раньше я как-то подчинялся стадному инстинкту, то сейчас он то ли сломался, то ли ещё что, но никакой радости от того, что 2009 поменялось на 2010, нет. Как, впрочем, и от смены любых одних цифр на любые другие.
A pile of.
Jan. 2nd, 2010 06:13 pmМосковское отделение 26с3
Dec. 25th, 2009 09:16 pmС 28 по 30 декабря с 13:00 по 19:00 в здании математического факультета МПГУ будет проходить московское отделение 26-й конференции Chaos Communication Congress.
В рамках московского отделения планируется просмотр трансляций отдельных выступлений в Германии (как записей, так и realtime), живое общение, и, при желании участников выступить с докладом, проведение оных.
Для участия в московском отделении необходимо зарегистрироваться.
( Краткая информация о буквах CCC и 26C3 )
Контактная информация (организаторы):
Ссылки:
В рамках московского отделения планируется просмотр трансляций отдельных выступлений в Германии (как записей, так и realtime), живое общение, и, при желании участников выступить с докладом, проведение оных.
Для участия в московском отделении необходимо зарегистрироваться.
( Краткая информация о буквах CCC и 26C3 )
Контактная информация (организаторы):
Ссылки:
- Различная информация о мероприятии. Страница постоянно эпизодически обновляется.
- Список рассылки московского отделения 26c3.
- Информация о 26c3.
- Список рассылки CCC. Для того, чтобы подписаться на него, достаточно отправить письмо по этому адресу.
- Информация о региональных отделениях 26c3.
- IRC-канал Dragons everywhere.
Таки приехала (спасибо, Броник!). Осталось забэкпортить драйвер в 24-е ведро и будет счастье.
Upd: Таки ничего бэкпортить не пришлось, старая версия лежала в git-репозитории ядра. Странно, что уже (минимум) восемь минорных версий оно в staging, ну да ладно. Ещё бы pcie hotplug работал, было бы вообще замечательно.
Upd: Таки ничего бэкпортить не пришлось, старая версия лежала в git-репозитории ядра. Странно, что уже (минимум) восемь минорных версий оно в staging, ну да ладно. Ещё бы pcie hotplug работал, было бы вообще замечательно.