Полезность перенаправлений

Довольно распространенная задача в скриптах – получить размер файла в различных попугаях, к примеру в строках. Для этих целей есть годная утилита wc. Вот только выхлоп у нее не очень удобный, кроме попугаев в выхлопе присутствует еще и имя файла. Чтобы эту гадость вырезать, необходимо прибегать к каким-то конвейерным конструкциям. НО! В случае, если файл подается на стандартный вход, имени никакого нет, и на выходе получается только необходимая величина. Поэтому идеал – lines=$(wc -l < /path/to/file)

Шалости с перенаправлениями

есть в составе coreutils очень забавная команда tty. все, что она делает – это выводит путь к текущему терминалу или псведотерминалу. что-то типа /dev/tty1 или /dev/pts/1. зачем это нужно, кроме как для понтов, спросите вы? а вот зачем.

к примеру, есть скриптик, кругом красивый и интерактивный, и использующий dialog, а не обычный read или подобное, для получения данных от пользователя. и есть необходимость получить какое-то значение, и сразу загнать его в переменную, без извращений с временными файлами или иными дополнительными сущностями. классический подход var=$(command) здесь не сработает. однако наворотив вот такую конструкцию

var=$(dialog --inputbox "Enter some data" 8 60 2>&1 > $(tty))

можно спокойно получить требуемый результат

Безопасность eval

и еще раз к вопросу о пользе чтения man-ов

eval считается крайне уязвимой конструкцией, особенно на произвольных данных. дескать, подставь ; и лепи себе дальше патчи бармина, сколько душе угодно.

оно то так, но есть в bash одна очень приятная штука для борьбы с этим злом – расширитель @. позволяет экранировать всякую каку без особых извратов с echo/sed/perl/whatever

Продовжити читання “Безопасность eval”

Временные метки при логировании

захотелось странного – меток времени в .xsession-errors. обычно этот файлик создается простым редиректом всего выхлопа через exec > blah-blah 2>&1. а далее в ход идет bash-евская магия с сопроцессами. в результате команда приобрела следующий вид

exec > >(while read ln ; do echo "[$(date)] : $ln" >> "${TMPDIR:-/tmp}/xsession-errors.$USER" ; done) 2>&1

дальше можно уже изгаляться как угодно, фильтры там добавить, чтобы лишнее отсеять ну или кто во что горазд

по хорошему, вместо дерганья внешней date надо бы написать свою командочку для вывода, благо последние версии bash (4.4) это позволяют. но это уже как-нибудь в другой раз

FVWM и буфер обмена

В связи с переходом на gtk3 встал вопрос о менеджере буфера обмена. Всякие parcellite и клоны, мягко говоря, дерьмецо. Заточены в основном под gtk2. Да и хренова туча всякой дополнительной лабуды в них мне и в хер не уперлась. Пришлось воротить что-то свое. В принципе, все, что мне нужно – это хранить некую не очень большую историю и иметь возможность выбрать нужный кусок.

В результате родилось следующее. Небольшой скриптик, использующий xclip для управления буферами и fvwm для его периодического дергания и организации меню выбора нужного куска.

Продовжити читання “FVWM и буфер обмена”