KnigaRead.com/
KnigaRead.com » Компьютеры и Интернет » Программирование » Мендель Купер - Искусство программирования на языке сценариев командной оболочки

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

На нашем сайте KnigaRead.com Вы можете абсолютно бесплатно читать книгу онлайн Мендель Купер, "Искусство программирования на языке сценариев командной оболочки" бесплатно, без регистрации.
Перейти на страницу:

}

trap _exit EXIT


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

# Prompt

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


if [[ "${DISPLAY#$HOST}" != ":0.0" && "${DISPLAY}" != ":0" ]]; then

HILIT=${red} # на удаленной системе: prompt будет частично красным

else

HILIT=${cyan} # на локальной системе: prompt будет частично циановым

fi


# --> Замените W на w в функциях ниже

#+ --> чтобы видеть в оболочке полный путь к текущему каталогу.


function fastprompt()

{

unset PROMPT_COMMAND

case $TERM in

*term | rxvt )

PS1="${HILIT}[h]$NC W > [33]0;${TERM} [ [email protected]h] w07]" ;;

linux )

PS1="${HILIT}[h]$NC W > " ;;

*)

PS1="[h] W > " ;;

esac

}


function powerprompt()

{

_powerprompt()

{

LOAD=$(uptime|sed -e "s/.*: ([^,]*).*/1/" -e "s/ //g")

}


PROMPT_COMMAND=_powerprompt

case $TERM in

*term | rxvt )

PS1="${HILIT}[A $LOAD]$NCn[h #] W > [33]0;${TERM} [ [email protected]h] w07]" ;;

linux )

PS1="${HILIT}[A - $LOAD]$NCn[h #] w > " ;;

* )

PS1="[A - $LOAD]n[h #] w > " ;;

esac

}


powerprompt # это prompt по-умолчанию - может работать довольно медленно

# Если это так, то используйте fastprompt....


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

#

# ПСЕВДОНИМЫ И ФУНКЦИИ

#

# Возможно некоторые из функций, приведенных здесь, окажутся для вас слишком большими,

# но на моей рабочей станции установлено 512Mb ОЗУ, так что.....

# Если пожелаете уменьшить размер этого файла, то можете оформить эти функции

# в виде отдельных сценариев.

#

# Большинство функций были взяты, почти без переделки, из примеров

# к bash-2.04.

#

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


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

# Псевдонимы

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


alias rm='rm -i'

alias cp='cp -i'

alias mv='mv -i'

# -> Предотвращает случайное удаление файлов.

alias mkdir='mkdir -p'


alias h='history'

alias j='jobs -l'

alias r='rlogin'

alias which='type -all'

alias ..='cd ..'

alias path='echo -e ${PATH//:/\n}'

alias print='/usr/bin/lp -o nobanner -d $LPDEST' # Предполагается, что LPDEST определен

alias pjet='enscript -h -G -fCourier9 -d $LPDEST' # Печать через enscript

alias background='xv -root -quit -max -rmode 5' # Положить картинку в качестве фона

alias du='du -kh'

alias df='df -kTh'


# Различные варианты 'ls' (предполагается, что установлена GNU-версия ls)

alias la='ls -Al' # показать скрытые файлы

alias ls='ls -hF --color' # выделить различные типы файлов цветом

alias lx='ls -lXB' # сортировка по расширению

alias lk='ls -lSr' # сортировка по размеру

alias lc='ls -lcr' # сортировка по времени изменения

alias lu='ls -lur' # сортировка по времени последнего обращения

alias lr='ls -lR' # рекурсивный обход подкаталогов

alias lt='ls -ltr' # сортировка по дате

alias lm='ls -al |more' # вывод через 'more'

alias tree='tree -Csu' # альтернатива 'ls'


# подготовка 'less'

alias more='less'

export PAGER=less

export LESSCHARSET='latin1'

export LESSOPEN='|/usr/bin/lesspipe.sh %s 2>&-' # если существует lesspipe.sh

export LESS='-i -N -w -z-4 -g -e -M -X -F -R -P%t?f%f

:stdin .?pb%pb%:?lbLine %lb:?bbByte %bb:-...'


# проверка правописания - настоятельно рекомендую :-)

alias xs='cd'

alias vf='cd'

alias moer='more'

alias moew='more'

alias kk='ll'


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

# добавим немножко "приятностей"

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


function xtitle ()

{

case "$TERM" in

*term | rxvt)

echo -n -e "33]0;$*07" ;;

*)

;;

esac

}


# псевдонимы...

alias top='xtitle Processes on $HOST && top'

alias make='xtitle Making $(basename $PWD) ; make'

alias ncftp="xtitle ncFTP ; ncftp"


# .. и функции

function man ()

{

for i ; do

xtitle The $(basename $1|tr -d .[:digit:]) manual

command man -F -a "$i"

done

}


function ll(){ ls -l " [email protected]"| egrep "^d" ; ls -lXB " [email protected]" 2>&-| egrep -v "^d|total "; }

function te() # "обертка" вокруг xemacs/gnuserv

{

if [ "$(gnuclient -batch -eval t 2>&-)" == "t" ]; then

gnuclient -q " [email protected]";

else

( xemacs " [email protected]" &);

fi

}


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

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

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


# Поиск файла по шаблону:

function ff() { find . -type f -iname '*'$*'*' -ls ; }

# Поиск файла по шаблону в $1 и запуск команды в $2 с ним:

function fe() { find . -type f -iname '*'$1'*' -exec "${2:-file}" {} ; ; }

# поиск строки по файлам:

function fstr()

{

OPTIND=1

local case=""

local usage="fstr: поиск строки в файлах.

Порядок использования: fstr [-i] "шаблон" ["шаблон_имени_файла"] "

while getopts :it opt

do

case "$opt" in

i) case="-i " ;;

*) echo "$usage"; return;;

esac

done

shift $(( $OPTIND - 1 ))

if [ "$#" -lt 1 ]; then

echo "$usage"

return;

fi

local SMSO=$(tput smso)

local RMSO=$(tput rmso)

find . -type f -name "${2:-*}" -print0 | xargs -0 grep -sn ${case} "$1" 2>&- |

sed "s/$1/${SMSO}${RMSO}/gI" | more

}


function cuttail() # удалить последние n строк в файле, по-умолчанию 10

{

nlines=${2:-10}

sed -n -e :a -e "1,${nlines}!{P;N;D;};N;ba" $1

}


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 [email protected] -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 " [email protected]";

done

}


function ask()

{

echo -n " [email protected]" '[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/'|

grep ^"$2" |sort -u ;

}


_longopts_func ()

{

case "${2:-*}" in

-*) ;;

*) return ;;

esac


case "$1" in

~*) eval cmd="$1" ;;

*) cmd="$1" ;;

esac

COMPREPLY=( $(_get_longopts ${1} ${2} ) )

}

complete -o default -F _longopts_func configure bash

complete -o default -F _longopts_func wget id info a2ps ls recode


_make_targets ()

{

local mdef makef gcmd cur prev i


COMPREPLY=()

Перейти на страницу:
Прокомментировать
Подтвердите что вы не робот:*