Решения тех проблем, с которым мне приходилось сталкиваться.

пятница, 29 октября 2010 г.

Звук по завершении долгой консольной команды

Допустим, нужно выполнить в терминале команду, которая выполняется достаточно долго, чтобы ее дожидаться ничем больше не занимаясь. В тоже время, бывает такая потребность, что как только команда выполнится нужно сделать какое-то следующее действие. Ну и вообще, просто чтобы не забыть, что она вообще там выполняется.
Придумано такое решение. Можно в командной строке указать, что после требуемой команды выполнить еще одну, которая ... подаст звуковой сигнал!
В простейшем случае воспроизвести звук из терминала можно командой beep. Чтобы не спутать звук, с обычным сигналом bell из терминала, в параметрах beep можно указать длительность и частоту звука. Звук будет воспроизведен через встроенный динамик (pc speaker).
Пример:


do_time_consuming_task; beep -f 1000 -l 500 -r 3


upd В xterm обнаружилась интересная функция. Называется PopupOnBell, в простейшем случае активируется при запуске с ключом -pob. В таком режиме, если на терминал выводится символ ASCII BELL (код 0x07 или 8-ричный 007), то окно терминала уведомляет менеджер о наличии активности (точно не знаю как назвать), после чего Desktop Manager, например, Gnome отображает кнопку такого окна на панели задач мигающей (примерно так, как если свернутый Instant Messanger получает новое сообщение).
Соответственно, можно, например, чтобы каждый раз, как shell в терминале получает управление (выводит приглашение) терминал сообщал о активности.

PS1="\\007$PS1"
sleep 5

Если выполнить эти команды, а потом свернуть окно xterm, то через 5 секунд оно замигает в панели задач.

upd #2 Аналогичное решение для gnome-terminal.

среда, 20 октября 2010 г.

Длинная командная строка через xargs

Иногда приходится выполнить команду с таким количеством аргументов, что '*' (звездочка) уже не работает - shell пытается создать слишком длинную командную строку. Выход - разбить список на несколько более мелких и выполнить команду для каждого из них. В том числе и для этого создана команда xargs.
Она получает список из stdin и выполняет переданную ей команду подставляя список в качестве ее аргументов. Для разбития списка на куски есть разные опции (-n или -s).
Но до сего момента я не подозревал, что список аргументов может быть не в самом конце нужной команды, но и в любом месте.
Для примера. Если нужно скопировать кучу файлов и cp * <dest> не работает. Пробуем писать:

ls * | xargs -n 1000 cp /dest

И оно тоже не будет работать, потому как список аргументов от xargs будет подставлен в конец команды cp и в итоге будет выглядеть примерно как:

cp /dest arg1 arg2 ... argn

Как поместить список аргументов в нужное место? А вот это в man'е не совсем очевидно при первом прочтении. А в итоге нужно делать так:

ls * | xargs -n 1000 -I FILES cp FILES dest

Что тут происходит? Опция -I сообщает xargs, что если подстрока 'FILES' встретится где-либо в части исполняемой команды (initial arguments), то именно в это место и нужно раскрыть список аргументов из stdin.

понедельник, 18 октября 2010 г.

Консольная мышь

Заимев в пользование IP-KVM, осознал потребность в консольной мыше. Для этой цели в ubuntu наличествует пакет gpm.

apt-get install gpm