# обрабатываются некорректно), но все еще актуальна. Автор 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
#
# 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
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).
Читать дальше