- •Лабораторная работа по курсу "Операционные системы" Интерфейс пользователя ос Linux и программирование на языке оболочки
- •I. Пользовательский интерфейс ос Linux
- •Интерфейс командной строки
- •Получение справочной информации о командах
- •Работа с файлами и каталогами
- •II. Введение в программирование на языке оболочки Разрешения на доступ к файлу
- •Язык оболочки
- •Порядок выполнения лабораторной работы
- •Требования
- •Вопросы
II. Введение в программирование на языке оболочки Разрешения на доступ к файлу
Разрешения, или привилегии, на доступ к файлу (file access permissions) определяют, как файл может быть использован владельцем, группой пользователей, к которой принадлежит владелец, и всеми прочими пользователями.
Пример: Пусть файл имеет привилегии 07558 = 111 101 1012. Тогда команда
$ls -l
выведет следующее:
-rwxr-xr-x 1 ivanov users 4096 Sep 6 2004 имя_файла







Владелец
Группа
Прочие
Владелец
Группа
Размер

Число связей
Это означает, что данный файл доступен для владельца на чтение, запись и выполнение; для группы users и прочих пользователей - только на запись и выполнение.
Изменить привилегии можно при помощи команды chmod или системного вызова chmod. Эта операция может быть выполнена только владельцем файла или суперпользователем (корневым пользователем).
В команде chmod используются следующие обозначения:
u владелец файла = назначить разрешение
g группа + добавить разрешение
o прочие - удалить разрешение
a все (владелец, группа, прочие)
Примеры.
$chmod u+x имя_файла Добавить разрешение на выполнение файла для владельца
$chmod g-rw имя_файла Удалить разрешение на чтение и запись файла для группы
$chmod a=r имя_файла Дать разрешение на запись файла для всех
Язык оболочки
Язык оболочки является разновидностью языка программирования (он похож на язык командных файлов MS DOS). Программы, написанные на языке оболочки, оформляются в виде текстовых исполняемых файлов, называемых файлами скриптов. Пример простого скрипта:
# Пример простого скрипта
date
who
ls
Пусть имя данного файла - mycom. Для его выполнения необходимо осуществить следующие шаги:
1. Сделать его исполняемым: $chmod u+x mycom
2. Выполнить его: $mycom
Файл скрипта может выполнить не обязательно оболочка, загруженная по умолчанию, но и любая другая. Для этого в файле необходимо указать комментарий специального вида, начинающийся с '#!'. Например, следующий скрипт будет выполнен оболочкой sh:
#! /bin/sh
date
who
ls
На рис. 1 представлены основные компоненты языка оболочки.

1. Переменные окружения (или стандартные переменные оболочки):
PATH - каталоги, разделенные символом ':', в которых оболочка ищет команды;
PWD - текущий рабочий каталог;
TERM - тип терминала;
SHELL - имя пути для оболочки по умолчанию;
Вывод всех переменных окружения: $set или $printenv
Вывод указанной переменной окружения: $echo $SHELL
Установка значения для переменной окружения: %set TERM=vt100 (без пробелов!)
Экспорт переменной окружения: $EDITOR=emacs
$export EDITOR или $export EDITOR=emacs
2. Переменные, определенные пользователем (или именованные переменные)
Пример присвоения значения именованной переменной count: count=10 (без пробелов!)
Для ссылки на значение переменной в программе перед ее именем указывается $, например:
$echo $count
3. Позиционные параметры (доступны только для чтения) принимают значения аргументов из командной строки. Их имена: $0 $1 $2 … $9.
4. Специальные переменные оболочки:
$? - код завершения последней выполненной команды;
$# - число аргументов в командной строке при запуске данной команды;
$$ - идентификатор процесса оболочки;
$! - идентификатор последнего фонового процесса, запущенного в оболочке.
5. Функции ввода-вывода: echo - функция вывода; read - функция ввода.
Задание 4.
4.1. Напишите простую программу script1 на языке оболочки, которая:
печатает имя и выводит содержимое текущего каталога;
выводит код завершения последней команды (команды ls);
экспортирует переменную окружения SERVER_NAME и задает ей значение "intel.com";
выводит сообщение End of program.
Сделайте файл script1 исполняемым, затем выполните команду $script1
Поясните результат. Как следует ввести команду для запуска script1 из Вашего каталога? Приведите два варианта: а) с указанием абсолютного пути; б) с указанием относительного пути.
4.2. Включите Ваш каталог lab1 в PATH: $PATH=$PATH:$HOME/lab1 Запишите в отчет значение переменной окружения PATH. Выполните еще раз команду $script1
4.3. Linux, как и UNIX, традиционно хранит исполняемые файлы в каталогах bin. Создайте в Вашем каталоге подкаталог bin и скопируйте в него script1. Запустите script1 из bin.
Задание 5. Наберите в каталоге lab1 и выполните следующие скрипты. Запишите в отчет текст каждого примера и полученные результаты с пояснениями.
script2 #Печать позиционных параметров
echo $0 $1 $2 $3 $4 $5 $6 $7 $8 $9
Можно ли вывести параметры с номерами больше 9?
script3 #Печать позиционных параметров
echo Всего $# параметров: $*
Работает ли данный пример, если число параметров в командной строке больше 9?
script4 echo Введите имя и фамилию
read name surname
echo $name $surname, Вы ввели $# параметров:
echo $*
6. Арифметические операции над целыми числами выполняются при помощи команды expr. Пример (используются обратные кавычки!):
#Сложить и вывести два позиционных параметра
sum=`expr $1 + $2`
echo $sum
7. Оператор if и команда test. В следующем примере set `date` запускает команду date и присваивает ее результаты позиционным параметрам. Первым параметром является день недели.
set `date`
if test $1 = Mon
then
echo "Сегодня начало недели"
else
echo "Сегодня другой день"
fi
8. Циклы (команды for, while, loop)
Задание 6. Выполните следующие примеры. В примере 6.1 параметры в командной строке должны быть целыми числами. Запишите в отчет текст каждого примера и полученные результаты с пояснениями.
script5 #Печать значений позиционных параметров, деленных на два
for number in $*
do
half=`expr number / 2`
echo $number $half
done
script6 #Печать позиционных параметров 5 раз
count=5
while test $count -gt 0
do
echo $*
count=`expr $count - 1`
done
script7 #Печать позиционных параметров 5 раз
count=5
until test $count -eq 0
do
echo $*
count=`expr $count - 1`
done
Задание 7. Разработать скрипт rmfile, предназначенный для "безопасного" (с подтверждением) удаления файла. Скрипт запускается командой $rmfile имя_файла. Скрипт
проверяет, является ли параметр командной строки именем файла. В операторе if используйте команду
test -f $<переменная_позиц.параметр№1>
если параметр не является файлом, то выводит соответствующее сообщение;
если параметр является файлом, то спрашивает, действительно ли пользователь желает удалить файл имя_файла; если да, то удаляет файл и сообщает, что файл удален; усли нет, то печатает соответствующее сообщение.
Запишите в отчет текст файла rmfile.
