Искусство программирования на языке сценариев командной оболочки - [138]

Шрифт
Интервал


function lowercase() # перевести имя файла в нижний регистр

{

for file ; do

filename=${file##*/}

case "$filename" in

*/*) dirname==${file%/*} ;;

*) dirname=.;;

esac

nf=$(echo $filename | tr A-Z a-z)

newname="${dirname}/${nf}"

if [ "$nf" != "$filename" ]; then

mv "$file" "$newname"

echo "lowercase: $file --> $newname"

else

echo "lowercase: имя файла $file не было изменено."

fi

done

}


function swap() # меняет 2 файла местами

{

local TMPFILE=tmp.$$

mv "$1" $TMPFILE

mv "$2" "$1"

mv $TMPFILE "$2"

}


#-----------------------------------

# Функции для работы с процессами/системой:

#-----------------------------------


function my_ps() { ps $@ -u $USER -o pid,%cpu,%mem,bsdtime,command ; }

function pp() { my_ps f | awk '!/awk/ && $0~var' var=${1:-".*"} ; }


# Эта функция является грубым аналогом 'killall' в linux

# но не эквивалентна (насколько я знаю) 'killall' в Solaris

function killps() # "Прибить" процесс по его имени

{

local pid pname sig="-TERM" # сигнал, рассылаемый по-умолчанию

if [ "$#" -lt 1 ] || [ "$#" -gt 2 ]; then

echo "Порядок использования: killps [-SIGNAL] шаблон_имени_процесса"

return;

fi

if [ $# = 2 ]; then sig=$1 ; fi

for pid in $(my_ps| awk '!/awk/ && $0~pat { print $1 }' pat=${!#} ) ; do

pname=$(my_ps | awk '$1~var { print $5 }' var=$pid )

if ask "Послать сигнал $sig процессу $pid <$pname>?"

then kill $sig $pid

fi

done

}


function my_ip() # IP адрес

{

MY_IP=$(/sbin/ifconfig ppp0 | awk '/inet/ { print $2 } ' | sed -e s/addr://)

MY_ISP=$(/sbin/ifconfig ppp0 | awk '/P-t-P/ { print $3 } ' | sed -e s/P-t-P://)

}


function ii() # Дополнительные сведения о системе

{

echo -e "\nВы находитесь на ${RED}$HOST"

echo -e "\nДополнительная информация:$NC " ; uname -a

echo -e "\n${RED}В системе работают пользователи:$NC " ; w -h

echo -e "\n${RED}Дата:$NC " ; date

echo -e "\n${RED}Время, прошедшее с момента последней перезагрузки :$NC " ; uptime

echo -e "\n${RED}Память :$NC " ; free

my_ip 2>&- ;

echo -e "\n${RED}IP адрес:$NC" ; echo ${MY_IP:-"Соединение не установлено"}

echo -e "\n${RED}Адрес провайдера (ISP):$NC" ; echo ${MY_ISP:-"Соединение не установлено"}

echo

}


# Разные утилиты:


function repeat() # повторить команду n раз

{

local i max

max=$1; shift;

for ((i=1; i <= max ; i++)); do # --> C-подобный синтаксис

eval "$@";

done

}


function ask()

{

echo -n "$@" '[y/n] ' ; read ans

case "$ans" in

y*|Y*) return 0 ;;

*) return 1 ;;

esac

}


#=========================================================================

#

# ПРОГРАММНЫЕ ДОПОЛНЕНИЯ - ТОЛЬКО НАЧИНАЯ С ВЕРСИИ BASH-2.04

# Большая часть дополнений взята из докуентации к bash 2.05 и из

# пакета 'Bash completion' (http://www.caliban.org/bash/index.shtml#completion)

# автор -- Ian McDonalds

# Фактически, у вас должен стоять bash-2.05a

#

#=========================================================================


if [ "${BASH_VERSION%.*}" \< "2.05" ]; then

echo "Вам необходимо обновиться до версии 2.05"

return

fi


shopt -s extglob # необходимо

set +o nounset # иначе некоторые дополнения не будут работать


complete -A hostname rsh rcp telnet rlogin r ftp ping disk

complete -A export printenv

complete -A variable export local readonly unset

complete -A enabled builtin

complete -A alias alias unalias

complete -A function function

complete -A user su mail finger


complete -A helptopic help

complete -A shopt shopt

complete -A stopped -P '%' bg

complete -A job -P '%' fg jobs disown


complete -A directory mkdir rmdir

complete -A directory -o default cd


# Архивация

complete -f -o default -X '*.+(zip|ZIP)' zip

complete -f -o default -X '!*.+(zip|ZIP)' unzip

complete -f -o default -X '*.+(z|Z)' compress

complete -f -o default -X '!*.+(z|Z)' uncompress

complete -f -o default -X '*.+(gz|GZ)' gzip

complete -f -o default -X '!*.+(gz|GZ)' gunzip

complete -f -o default -X '*.+(bz2|BZ2)' bzip2

complete -f -o default -X '!*.+(bz2|BZ2)' bunzip2

# Postscript,pdf,dvi.....

complete -f -o default -X '!*.ps' gs ghostview ps2pdf ps2ascii

complete -f -o default -X '!*.dvi' dvips dvipdf xdvi dviselect dvitype

complete -f -o default -X '!*.pdf' acroread pdf2ps

complete -f -o default -X '!*.+(pdf|ps)' gv

complete -f -o default -X '!*.texi*' makeinfo texi2dvi texi2html texi2pdf

complete -f -o default -X '!*.tex' tex latex slitex

complete -f -o default -X '!*.lyx' lyx

complete -f -o default -X '!*.+(htm*|HTM*)' lynx html2ps

# Multimedia

complete -f -o default -X '!*.+(jp*g|gif|xpm|png|bmp)' xv gimp

complete -f -o default -X '!*.+(mp3|MP3)' mpg123 mpg321

complete -f -o default -X '!*.+(ogg|OGG)' ogg123


complete -f -o default -X '!*.pl' perl perl5


# Эти 'универсальные' дополнения работают тогда, когда команды вызываются

# с, так называемыми, 'длинными ключами', например: 'ls --all' вместо 'ls -a'


_get_longopts ()

{

$1 --help | sed -e '/--/!d' -e 's/.*--\([^[:space:].,]*\).*/--\1/'| \


Рекомендуем почитать
Графика DirectX в Delphi

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


Вторая жизнь старых компьютеров

Сейчас во многих школах, институтах и других учебных заведениях можно встретить компьютеры старого парка, уже отслужившие свое как морально, так и физически. На таких компьютерах можно изучать разве что Dos, что далеко от реалий сегодняшнего дня. К тому же у большинства, как правило, жесткий диск уже в нерабочем состоянии. Но и выбросить жалко, а новых никто не дает. Различные спонсоры, меценаты, бывает, подарят компьютер (один) и радуются, как дети. Спасибо, конечно, большое, но проблемы, как вы понимаете, этот компьютер в общем не решает, даже наоборот, усугубляет, работать на старых уже как-то не хочется, теперь просто есть с чем сравнивать.


DirectX 8. Начинаем работу с DirectX Graphics

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


Симуляция частичной специализации

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


Обработка событий в С++

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


Питон — модули, пакеты, классы, экземпляры

Python - объектно-ориентированный язык сверхвысокого уровня. Python, в отличии от Java, не требует исключительно объектной ориентированности, но классы в Python так просто изучить и так удобно использовать, что даже новые и неискушенные пользователи быстро переходят на ОО-подход.