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