76
xlist=$(ls "$xdir" | grep $fl )
[ "x$xlist" != "x" ] || if_exit "${red}Нет тем${gray}, доступных для подключения...
"
echo |
-e "${green}Список доступных тем$gray обучения..." |
|
echo |
"-------------------------------- |
" |
for xx in ${xlist}; do |
|
|
|
x1=$(echo $xx | cut -d '-' -f 1 ) |
|
done |
echo -e "${yellow}${x1}$gray" |
|
|
|
|
echo "-------------------------------- |
" |
|
echo |
-en "${green}Введи имя учебной темы$gray для подключения: " |
|
read aa |
|
|
export THEME="$aa" |
|
|
echo |
"Проверяем наличие архива... |
" |
xarch="${xdir}/${THEME}-$fl" |
|
|
[ -f |
"$xarch" ] || if_exit "${red}Отсутствует файл архива${gray}: ${xarch}" |
|
warch="${wdir}/${THEME}-home.ext4fs"
#------------------------------------
# Копируем тему обучения
echo "Запоминаю тему обучения..."
echo "export UPK_THEME=$THEME" > ~/.upk_theme if [ "$xarch" != "$warch" ]; then
echo "Копирую файл архива в рабочую область..."
###sudo cp -v "$xarch" "$warch"
sudo /etc/upkasu/from-gzip "$xarch" "$warch"
fi
#------------------------------------
# Монтирование рабочей области:
echo -e "${green}Монтируем$gray файловую систему пользователя$yellow upk$gray \ в директорию$blue /home/upk$gray ..."
sudo mount -t ext4 "$warch" /home/upk -o loop
[ "$?" == "0" ] || if_exit "${red}Не могу смонтировать$gray $warch на /home/upk"
if [ -f "/home/upk/.upk_theme" ]; then
echo -e "\n"\
"Тема$blue $THEME -$green успешно подлючена...$gray \n"\
"Вам следует выйти из сессии пользователя$yellow asu$gray и подключитья \n"\ "как пользователь$yellow upk ${gray}!"
if_exit " "
fi
if_exit "Тема $THEME - подлючена (Необходима дополнительная проверка!!!)"
Листинг 3.2 — Сценарий mount-upk.sh — подключение архива студента
#!/bin/sh
#
#############################################################
#Reznik, 02.09.2016
#Копирование рабочей области пользователя upk на flashUSB
#Файл сценария: /etc/upkasu/copy-to-flash.sh
#############################################################
77
#
#Данный сценарий обеспечивает копирование рабочей области
#темы обучения на личный flashUSB студента.
#Используем функцию для вывода сообщения и выхода из программы: if_exit()
{
echo -e "$@"
read -p "Нажми клавишу Enter..." aa exit 0
}
#Читаем парметры окружения:
. /etc/upkasu/upkasu.conf
. /etc/upkasu/upk.colors
. ~/.upk_theme
echo "##########################################"
echo -e "${red}Копирование архива на flashUSB студента...${gray}\n" [ "$ROOT_ARCH" != "$ROOT_DIST" ] || \
if_exit "${green}Рабочая область и архив - одно и тоже устройство!!!${gray}"
#Находим устройства архива и дистрибутива ОС: xdev=$(blkid -U "$ROOT_ARCH")
[ "x$xdev" != "x" ] || \
if_exit "${yellow}Необходимо вставить устройство архива и попробовать снова!..${gray}"
xdir=$(mount | grep "$xdev" | cut -d ' ' -f 3 ) [ "x$xdir" != "x" ] || \
if_exit "${yellow}Подмонтируйте устройство архива... и попробуйте снова!..$ {gray}"
[ "x$xdir" != "x/" ] || xdir="" dira="${xdir}/${UPK_PATH}/themes" [ -d "$dira" ] || \
if_exit "Не могу найти директорию архива... Обратитесь к преподавателю!.."
#Проверяем монтирование рабочей области:
wdir="$UPK_MOUNT"
[ "x$wdir" != "x/" ] || wdir="" fa="${wdir}/${UPK_PATH}/themes/${UPK_THEME}-home.ext4fs" xx=$(mount | grep "$fa" )
[ "x$xx" == "x" ] || \
if_exit "${yellow}Сначала отключите тему, а потом - архивируйте!${gray}"
sudo /etc/upkasu/to-gzip "$fa" "${dira}/${UPK_THEME}-home.ext4fs.gz" || \
if_exit "${yellow}Не могу перенести архив... Обратитесь к преподавателю!..$ {gray}"
# Закончили копирование архива:
if_exit "${green}Перенесено:$blue из ${fa}$red в ${dira}/${UPK_THEME}- home.ext4fs.gz${gray}"
Кроме управляющих конструкций, shell содержит ряд встроенных (специальных) команд.
Замечание
Если не оговорено иное, команды выводят результаты в файл с дескриптором 1.
78
:Пустая команда. Возвращает нулевой код завершения.
.файл
Shell читает и выполняет команды из файла, затем возобновляется чтение со стандартного ввода; при поиске файла используется значение переменной
PATH.
break [n]
Выйти из внутреннего for или while цикла; если указано n, то выйти из n внутренних циклов.
continue [n]
Перейти к следующей итерации внутреннего for или while цикла; если указано n, то перейти к следующей итерации n-ого цикла.
cd |
[каталог] |
|
|
|
|
|
|
|
Сделать текущим заданный каталог. Если каталог не |
||||||
|
указан, используется значение переменной HOME. Пе- |
||||||
|
ременная CDPATH определяет список поиска каталога. |
||||||
|
По умолчанию этот список пуст (то есть поиск |
про- |
|||||
|
изводится только в текущем каталоге). Если каталог |
||||||
|
начинается с символа /, список поиска не использу- |
||||||
|
ется. |
|
|
|
|
|
|
echo |
[аргумент ...] |
|
|
|
|
|
|
|
Выдать аргументы на стандартный вывод, разделяя их |
||||||
|
пробелами [см. также echo(1)]. |
|
|
|
|
|
|
eval |
[аргумент ...] |
|
|
|
|
|
|
|
Выполнить команду, заданную аргументами eval. |
|
|||||
exec |
[аргумент ...] |
|
|
|
|
|
|
|
Сменить программу процесса: в рамках текущего про- |
||||||
|
цесса команда, заданная аргументами exec, заменяет |
||||||
|
shell. В качестве аргументов |
могут |
быть |
указаны |
|||
|
спецификации ввода/вывода и, если нет никаких дру- |
||||||
|
гих аргументов, будет лишь переназначен ввод/вывод |
||||||
|
текущего shell'а. |
|
|
|
|
|
|
exit |
[код_завершения] |
|
|
|
|
|
|
|
Завершить выполнение shell'а |
с |
указанным |
кодом. |
|||
|
При отсутствии аргумента код завершения |
определя- |
|||||
|
ется последней выполненной командой. Чтение симво- |
||||||
|
ла конца файла также приводит |
|
к |
завершению |
|||
|
shell'а. |
|
|
|
|
|
|
export [переменная ...] |
|
|
|
|
|
|
|
|
Заданные переменные отмечаются для автоматического |
||||||
|
экспорта в окружение выполняемых команд. Если |
ар- |
|||||
|
гументы не указаны, выводится список всех |
экспор- |
|||||
|
тируемых переменных. Имена функций не |
могут |
экс- |
||||
|
портироваться. Имена переменных, |
экспортированных |
|||||
|
из родительского shell'а, выдаются |
только |
в |
том |
|||
|
случае, если они были экспортированы и из текущего |
||||||
|
shell'а. |
|
|
|
|
|
|
getopts
Используется в shell-процедурах для поддержания синтаксических стандартов [см. intro(1)]; разбирает позиционные параметры и проверяет допустимость задания опций [см. getopts(1)].
hash [-r] [имя_команды ...]
79
Для каждого из указанных имен_команд |
определяется |
||||
и запоминается маршрут поиска - место в списке по- |
|||||
иска, где удалось найти команду. Опция -r |
удаляет |
||||
все запомненные данные. Если не указан ни один |
ар- |
||||
гумент, то выводится информация о запомненных |
ко- |
||||
мандах: hits - количество обращений shell'а к дан- |
|||||
ной команде; cost - объем работы |
для |
обнаружения |
|||
команды в соответствии со списком поиска; |
command |
||||
- полное имя команды. Звездочкой |
в |
колонке |
hits |
||
помечаются команды, маршрут поиска |
которых |
будет |
|||
перевычисляться после смены текущего каталога [см. |
|||||
cd(1)]; расходы на перевычисление |
учитываются в |
||||
колонке cost. |
|
|
|
|
|
newgrp |
[аргумент ...] |
|
|
|
|
Выполяет регистрацию пользователя в новой группе |
|||||
[man 1 newgrp]. |
|
|
|
|
|
pwd Выводит имя текущего каталога. [см. pwd(1)]. |
|
||||
read |
[переменная ...] |
|
|
|
|
Со стандартного ввода читается одна строка |
и |
де- |
|||
лится на слова с учетом разделителей, |
перечислен- |
||||
ных в значении переменной IFS (обычно |
это |
пробел |
|||
или табуляция); первое слово присваивается |
первой |
||||
переменной, второе - второй и т.д., причем все ос- |
|||||
тавшиеся слова присваиваются последней переменной. Исходная строка имеет продолжение, если в конце ее стоит последовательность \перевод_строки. Символы, отличные от перевода строки, также могут быть экранированы с помощью \, который удаляется перед присваиванием слов. Возвращается нулевой код завершения, если только не встретился конец файла.
readonly [переменная ...]
Указанные переменные отмечаются как доступные только на чтение. Присваивания таким переменным трактуются как ошибки. Если аргументы не указаны, то выводится информация обо всех переменных, доступных только на чтение.
return [код_завершения]
Выйти из функции с указанным кодом_завершения. Если аргумент опущен, то код завершения наследуется от последней выполненной команды.
set [-a] [-e] [-f] [-h] [-k] [-n] [-t] [-u] [-v] [-x] [--] [аргумент …]]
-a Экспортировать переменные, которые изменяются или создаются, в окружение.
-e Выйти из shell'а, если какая-либо команда возвращает ненулевой код завершения.
-f Запретить генерацию имен файлов.
-h Определить и запомнить местоположение всех команд, входящих в тело функции, во время ее определения, а не во время выполнения.
-k Поместить в окружение команды все переменные, получившие значение в командной строке, а не только те, что предшествуют имени команды.
-n Читать команды, но не выполнять их.
80
-t Выйти из shell'а после ввода и выполнения одной команды.
-u Рассматривать подстановку параметров, не получивших значений, как ошибку.
-v Выводить исходные для shell'а строки сразу после их ввода.
-x Выводить команды и их аргументы непосредственно перед выполнением.
--Не изменяет флаги. Полезно использовать для присваивания позиционному параметру $1 значения -:
set -- -
При указании + вместо - перечисленные выше режимы выключаются. Описанные флаги могут также использоваться при запуске shell'а. Набор текущих флагов есть значение переменной $-. Следующие за флагами аргументы будут присвоены позиционным параметрам $1, $2 и т.д. Если не заданы ни флаги, ни аргументы, выводятся значения всех переменных.
shift [n]
Позиционные параметры, начиная с (n+1)-го, переименовываются в $1 и т.д. По умолчанию n=1.
test Вычислить условное выражение [см. test(1)].
times Вывести суммарные времена пользователя и системы, затраченные на выполнение процессов, запущенных данным shell'ом.
trap [имя_команды] [n] ...
Команда с указанным именем будет прочитана и выполнена, когда shell получит сигнал(ы) n. Заметим, что имя_команды обрабатывается при установке прерывания и при получении сигнала. Команды выполняются в порядке номеров сигналов. Нельзя установить обработку прерывания по сигналу, игнорируемому данным shell'ом. Попытка установить обработку прерывания по сигналу 11 (выход за допустимые границы памяти) приводит к ошибке. Если имя_команды опущено, то для прерываний с указанными номерами n восстанавливается первоначальная реакция. Если имя_команды есть пустая строка, то этот сигнал будет игнорироваться shell'ом и вызываемыми им программами. Если n равно 0, то указанная команда выполняется при выходе из shell'а. Trap без аргументов выводит список команд, связанных с каждым сигналом.
type [имя ...]
Для каждого имени указывается, как оно будет интерпретироваться при использовании в качестве имени команды.
ulimit [размер_в_блоках]
Установить максимальный размер_в_блоках (по 1 Кб) тех файлов, в которые пишут данный shell и его потомки (читать можно файлы любого размера) [см. ulimit(1)]. Если размер не указан, выдается текущий лимит. Каждый пользователь может уменьшить