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

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

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

COMPREPLY=()

cur=${COMP_WORDS[COMP_CWORD]}

prev=${COMP_WORDS[COMP_CWORD-1]}


# Если аргумент prev это -f, то вернуть возможные варианты имен файлов.

# будем великодушны и вернем несколько вариантов

# `makefile Makefile *.mk'

case "$prev" in

-*f) COMPREPLY=( $(compgen -f $cur ) ); return 0;;

esac


# Если запрошены возможные ключи, то вернуть ключи posix

case "$cur" in

-) COMPREPLY=(-e -f -i -k -n -p -q -r -S -s -t); return 0;;

esac


# попробовать передать make `makefile' перед тем как попробовать передать `Makefile'

if [ -f makefile ]; then

mdef=makefile

elif [ -f Makefile ]; then

mdef=Makefile

else

mdef=*.mk

fi


# прежде чем просмотреть "цели", убедиться, что имя makefile было задано

# ключом -f

for (( i=0; i < ${#COMP_WORDS[@]}; i++ )); do

if [[ ${COMP_WORDS[i]} == -*f ]]; then

eval makef=${COMP_WORDS[i+1]}

break

fi

done


[ -z "$makef" ] && makef=$mdef


# Если задан шаблон поиска, то ограничиться

# этим шаблоном

if [ -n "$2" ]; then gcmd='grep "^$2"' ; else gcmd=cat ; fi


# если мы не желаем использовать *.mk, то необходимо убрать cat и использовать

# test -f $makef с перенаправлением ввода

COMPREPLY=( $(cat $makef 2>/dev/null | awk 'BEGIN {FS=":"} /^[^.# ][^=]*:/ {print $1}' | tr -s ' ' '12' | sort -u | eval $gcmd ) )

}


complete -F _make_targets -X '+($*|*.[cho])' make gmake pmake


# cvs(1) completion

_cvs ()

{

local cur prev

COMPREPLY=()

cur=${COMP_WORDS[COMP_CWORD]}

prev=${COMP_WORDS[COMP_CWORD-1]}


if [ $COMP_CWORD -eq 1 ] || [ "${prev:0:1}" = "-" ]; then

COMPREPLY=( $( compgen -W 'add admin checkout commit diff

export history import log rdiff release remove rtag status

tag update' $cur ))

else

COMPREPLY=( $( compgen -f $cur ))

fi

return 0

}

complete -F _cvs cvs


_killall ()

{

local cur prev

COMPREPLY=()

cur=${COMP_WORDS[COMP_CWORD]}


# получить список процессов

COMPREPLY=( $( /usr/bin/ps -u $USER -o comm |

sed -e '1,1d' -e 's#[][]##g' -e 's#^.*/##'|

awk '{if ($0 ~ /^'$cur'/) print $0}' ))


return 0

}


complete -F _killall killall killps


# Функция обработки мета-команд

# В настоящее время недостаточно отказоустойчива (например, mount и umount

# обрабатываются некорректно), но все еще актуальна. Автор Ian McDonald, изменена мной.


_my_command()

{

local cur func cline cspec


COMPREPLY=()

cur=${COMP_WORDS[COMP_CWORD]}


if [ $COMP_CWORD = 1 ]; then

COMPREPLY=( $( compgen -c $cur ) )

elif complete -p ${COMP_WORDS[1]} &>/dev/null; then

cspec=$( complete -p ${COMP_WORDS[1]} )

if [ "${cspec%%-F *}" != "${cspec}" ]; then

# complete -F <function>

#

# COMP_CWORD and COMP_WORDS() доступны на запись,

# так что мы можем установить их перед тем,

# как передать их дальше


# уменьшить на 1 текущий номер лексемы

COMP_CWORD=$(( $COMP_CWORD - 1 ))

# получить имя функции

func=${cspec#*-F }

func=${func%% *}

# получить командную строку, исключив первую команду

cline="${COMP_LINE#$1 }"

# разбить на лексемы и поместить в массив

COMP_WORDS=( $cline )

$func $cline

elif [ "${cspec#*-[abcdefgjkvu]}" != "" ]; then

# complete -[abcdefgjkvu]

#func=$( echo $cspec | sed -e 's/^.*(-[abcdefgjkvu]).*$/1/' )

func=$( echo $cspec | sed -e 's/^complete//' -e 's/[^ ]*$//' )

COMPREPLY=( $( eval compgen $func $cur ) )

elif [ "${cspec#*-A}" != "$cspec" ]; then

# complete -A <type>

func=${cspec#*-A }

func=${func%% *}

COMPREPLY=( $( compgen -A $func $cur ) )

fi

else

COMPREPLY=( $( compgen -f $cur ) )

fi

}


complete -o default -F _my_command nohup exec eval trace truss strace sotruss gdb

complete -o default -F _my_command command type which man nice


# Локальные переменные:

# mode:shell-script

# sh-shell:bash

# Конец:


Приложение H. Преобразование пакетных (*.bat) файлов DOS в сценарии командной оболочки

Большое число программистов начинало изучать скриптовые языки на PC, работающих под управлением DOS. Даже на этом "калеке" удавалось создавать неплохие сценарии, хотя это и требовало значительных усилий. Иногда еще возникает потребность в переносе пекетных файлов DOS на платформу UNIX, в виде сценариев командной оболочки. Обычно это не сложно, поскольку набор операторов, доступных в DOS, представляет из себя ограниченное подмножество эквивалентных команд, доступных в командной оболочке.

Таблица H-1. Ключевые слова/переменные/операторы пакетных файлов DOS и их аналоги командной оболочки

Операторы пакетных файлов Эквивалентные команды в UNIX Описание % $ префикс аргументов командной строки / - признак ключа (опции) / разделитель имен каталогов в пути == = (равно) сравнение строк !==! != (не равно) сравнение строк | | конвейер (канал) @ set +v не выводить текущую команду * * "шаблонный символ" в имени файла > > перенаправление (с удалением существующего файла) >> >> перенаправление (с добавлением в конец существующего файла) < < перенаправление ввода stdin %VAR% $VAR переменная окружения REM # комментарий NOT ! отрицание последующего условия NUL /dev/null "черная дыра" для того, чтобы "спрятать" вывод команды ECHO echo вывод (в Bash имеет большое число опций) ECHO. echo вывод пустой строки ECHO OFF set +v не выводить последующие команды FOR %%VAR IN (LIST) DO for var in [list]; do цикл "for" :LABEL эквивалент отсутствует (нет необходимости) метка GOTO эквивалент отсутствует (используйте функции) переход по заданной метке PAUSE sleep пауза, или ожидание, в течение заданного времени CHOICE case или select выбор из меню IF if условный оператор if IF EXIST FILENAME if [ -e filename ] проверка существования файла IF !%N==! if [ -z "$N" ] Проверка: параметр "N" отсутствует CALL source или . (оператор "точка") "подключение" другого сценария COMMAND /C source или . (оператор "точка") "подключение" другого сценария (то же, что и CALL) SET export установить переменную окружения SHIFT shift сдвиг списка аргументов уомандной строки влево SGN -lt или -gt знак (целого числа) ERRORLEVEL $? код завершения CON stdin "консоль" (stdin) PRN /dev/lp0 устройство принтера LPT1 /dev/lp0 устройство принтера COM1 /dev/ttyS0 первый последовательный порт

Пакетные файлы обычно содержат вызовы команд DOS. Они должны быть заменены эквивалентными командами UNIX.

Таблица H-2. Команды DOS и их эквиваленты в UNIX

Команды DOS Эквивалент в UNIX Описание ASSIGN ln ссылка на файл или каталог ATTRIB chmod изменить атрибуты файла (права доступа) CD cd сменить каталог CHDIR cd сменить каталог CLS clear очистить экран COMP diff, comm, cmp сравнить файлы COPY cp скопировать файл Ctl-C Ctl-C прервать исполнение сценария Ctl-Z Ctl-D EOF (конец-файла) DEL rm удалить файл(ы) DELTREE rm -rf удалить каталог с подкаталогами DIR ls -l вывести содержимое каталога ERASE rm удалить файл(ы) EXIT exit завершить текущий процесс FC comm, cmp сравнить файлы FIND grep найти строку в файлах MD mkdir создать каталог MKDIR mkdir создать каталог MORE more постраничный вывод MOVE mv переместить PATH $PATH путь поиска исполняемых файлов REN mv переименовать (переместить) RENAME mv переименовать (переместить) RD rmdir удалить каталог RMDIR rmdir удалить каталог SORT sort отсортировать файл TIME date вывести системное время TYPE cat вывести содержимое файла на stdout XCOPY cp (расширенная команда) скопировать файл

Фактически, команды и операторы командной оболочки UNIX имеют огромное количество дополнительных опций, расширяющих их функциональность, по сравнению с их эквивалентами в DOS. В большинстве своем, пакетные файлы DOS предполагают наличие вспомогательных утилит, таких как ask.com ("увечный" аналог UNIX-вого read).

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