"Кодим в Bash!"

Гребенников Роман ака voy

Xakep, номер #055, стр. 055-064-2


#!/bin/sh

var1='Мама мыла раму'

var2='раму'

var3='пол'

echo `echo $var1 | sed s/$var2/$var3/` # заменяем слово "раму" на "пол"

echo $var1 и $var3 # добавляем к исходной строке третью строку

Я думаю, тут все понятно, кроме двух вещей: команды sed и кучи апострофов. Sed - подпрограмма Bash для работы с текстом на лету, т.е. она перехватывает весь вывод и делает с ним какие-нибудь преобразования, а потом отправляет его в stdout. В данном случае мы из 'echo $var1' выхватывали первое слово 'раму' и заменяли его словом 'пол'. У sed существует куча возможностей, если хочешь узнать о них подробнее, набери 'info sed'. Обрати внимание на апострофы: в пятой строчке они обратные. Это позволяет просто выполнить какую-либо команду и спихнуть все, что она наговорила, как параметр в какую-нибудь другую команду.

[Полезное: убивалка]

Так, теперь пора навалять что-нибудь более полезное. Давай разберем маленькую программку, убивающую все процессы с именем, которое ей дали как параметр, т.е. запустили 'killps xmms', где killps - наша с тобой программка, а xmms - та группа процессов, которые мы хотим убить.

#!/bin/sh

USER=`whoami` # сшибаем только свои процессы

PARAM=$@ # запихиваем в эту переменную все параметры запуска

if test "$param" = ""; then # если нет параметра, то вываливаемся с ошибкой

echo Ты что-то забыл...

exit 0

fi # завершение конструкции if-then

for num in `ps -u $USER|grep $PARAM|cut -b 1-6`; do

echo убиваю $num....

kill $num

done # завершение цикла

Не мешало бы разобрать самую длинную строку нашей программулины. Ну 'for ... done' - это цикл, об этом любой догадается. А вот остальное - это самое интересное: три команды, разделенные знаком |, позволяют вывод первой затолкать во вторую, а, соответственно, вывод второй - в третью. Эта возможность часто используется в такого рода скриптах, чтобы не заводить кучу временных переменных. Команда 'ps -u <user>', я думаю, тебе частично знакома, можешь поиграться с ней в консоли, ничего страшного в ней нет. А вот cut вряд ли тебе известна. Эта штуковина может вырезать разные подстроки из данной строки. В нашем случае мы схватили первые 6 байт, т.е. pid. Программка получилась очень даже полезная при убивании тяжелых монстров, типа гнома или кде, в случае их зависания или простого надоедания.

[Полезное: скриншоты]

Помнишь, в начале статьи я что-то наплел про работу Bash c x-win? Так вот, шелестеть иксами действительно можно, но только с использованием кое-каких библиотек. Давай разберем примерчик, который всего лишь делает скриншот root-window и засовывает полученное в какой-нибудь файл. Удобно забиндить для этой команды какую-нибудь кнопочку и не мучиться с монстроподобным гимпом каждый раз, когда тебе нужен скриншот.

Для работы этого скрипта нужен пакет программ ImageMagick, наверняка он у тебя установлен. Из этого пакета нам потребуется всего одна программка import, так что если она у тебя есть, весь набор можно не качать. Но вернемся к нашему скрипту:

#!/bin/sh

SCRDIR=screens

ok=0

num=0

if [ ! -d $HOME/$SCRDIR ]; then # если нет папки screens,

Назад на стр. 055-064-1  Содержание  Вперед на стр. 055-064-3