Реклама: | Скачать 183.33 Kb.
|
МИНИСТЕРСТВО ОБРАЗОВАНИЯ И НАУКИ РФ Московский государственный институт электроники и математики (Технический университет) Кафедра электронно-вычислительной аппаратуры ПРОГРАММИРОВАНИЕ В ОПЕРАЦИОННОЙ СРЕДЕ UNIX НА КОМАНДНОМ ЯЗЫКЕ «SHELL» Методические указания к лабораторной работе по дисциплине«Операционные системы» 220101 – Вычислительные машины, комплексы, системы и сети Москва 2007 Составители: кандидат технический наук, доцент И.Е. Сафонова,кандидат технический наук, доцент Ю.А. Истратов УДК 681.1.5 Программирование в операционной среде ^ на командном языке «SHELL» /Московский государственный институт электроники и математики; Сост.: Ю.А.Истратов, И.Е.Сафонова. М.: МИЭМ, 2007, 18 с. Библиогр.: 4 назв. Рассматриваются вопросы программирования в ОС ^ на командном языке «SHELL». Приведены задания лабораторных работ и примеры выполнения. ISBN 978-5-94506-161-3 ВВЕДЕНИЕ В данном методическом указании рассматриваются вопросы программирования в операционной системе UNIX. Излагаемый материал является общим для всех разновидностей UNIX – систем. Представлена информация о командах ОС UNIX, системных вызовах, среде пользователя. Представлены теоретические сведения по предмету «операционные системы». Приведены задания лабораторных работ и примеры их выполнения на языке «Shell». ^ 1 ПРОСТЕЙШИЕ СРЕДСТВА SHELL Командный язык shell (в переводе - раковина, скорлупа) фактически есть язык программирования очень высокого уровня. На этом языке пользователь осуществляет управление компьютером. Обычно, после входа в систему вы начинаете взаимодействовать с командной оболочкой (если угодно - она начинает взаимодействовать с вами). Признаком того, что оболочка (shell) готова к приему команд служит выдаваемый ею на экран промптер. В простейшем случае это один доллар ("$"). Shell не является необходимым и единственным командным языком (хотя именно он стандартизован в рамках POSIX [POSIX 1003.2] - стандарта мобильных систем). Например, немалой популярностью пользуется язык cshell, есть также kshell, bashell (из наиболее популярных в последнее время) и другие. Более того, каждый пользователь может создать свой командный язык. Может одновременно на одном экземпляре операционной системы работать с разными командными языками. Shell - это одна из многих команд UNIX. То есть в набор команд оболочки (интерпретатора) "shell" входит команда "sh" - вызов интерпретатора "shell". Первый "shell" вызывается автоматически при вашем входе в систему и выдает на экран промтер. После этого вы можете вызывать на выполнение любые команды, в том числе и снова сам "shell", который вам создаст новую оболочку внутри прежней. Так например, если вы подготовите в редакторе файл "f1": echo Hello! то это будет обычный текстовый файл, содержащий команду "echo", которая при выполнении выдает все написанное правее ее на экран. Можно сделать файл "f1" выполняемым с помощью команды "chmod 755 f1". Но его можно ВЫПОЛНИТЬ, вызвав явно команду (!) "sh" ("shell"): sh f1 или sh < f1 Файл можно выполнить и в текущем экземпляре "shell". Для этого существует специфическая команда "." (точка), т.е. «. f1» Не начинайте командные файлы с символа "#", хотя естественно начинать его с комментария. Дело в том, что такой командный файл в оболочке C-Shell ("csh") будет интерпретирован как выполняемый в "csh", в результате будет активизирован. интерпретатор "csh". Начинайте командный sh-файл с пустой строки или пустого оператора ":". Поскольку UNIX - система многопользовательская, вы можете даже на персональном компьютере работать параллельно, скажем, на 12-ти экранах (переход с экрана на экран ALT/функциональная клавиша), имея на каждом экране нового (или одного и того же) пользователя со своей командной оболочкой. Можете и в графическом режиме X-Window также открыть большое число окон, а в каждом окне может быть свой свой пользователь со своей командной оболочкой... ^Команды в shell обычно имеют следующий формат:<имя команды> <флаги> <аргумент(ы)>Например:ls -ls /usr/binгде ls - имя команды выдачи содержимого директория, -ls - флаги ( "-" - признак флагов, l - длинный формат, s - об'ем файлов в блоках)./usr/bin - директорий, для которого выполняется команда.Эта команда выдаст на экран в длинном формате содержимое директория /usr/bin, при этом добавит информацию о размере каждого файла в блоках.К сожалению, такая структура команды выдерживается далеко не всегда. Не всегда перед флагами ставится минус, не всегда флаги идут одним словом. Есть разнообразие и в представлении аргументов. К числу команд, имеющих экзотические форматы, относятся и такие "ходовые" команды, как сс, tar, dd, find и ряд других.Как правило (но не всегда), первое слово (т.е. последовательность символов до пробела, табуляции или конца строки) shell воспринимает, как команду. Поэтому в командной строкеcat catпервое слово будет расшифровано shell, как команда (конкатенации), которая выдаст на экран файл с именем "cat" (второе слово), находящийся в текущем директории.^Средства группировки:; и <перевод строки> - определяют последовательное выполнение команд;& - асинхронное (фоновое) выполнение предшествующей команды;&& - выполнение последующей команды при условии нормального завершения предыдущей, иначе игнорировать;|| - выполнение последующей команды при ненормальном завершении предыдущей, иначе игнорировать.При выполнении команды в асинхронном режиме (после команды стоит один амперсенд) на экран выводится номер процесса, соответствующий выполняемой команде, и система, запустив этот фоновый процесс, вновь выходит на диалог с пользователем. Например, наберем (экзотическую) команду "find" в фоновом режиме для поиска в системе, начиная от корня "/", файла с именем "conf", а затем "pwd" в обычном режиме. На экране этот фрагмент будет выглядеть следующим образом:--------------------------------| $ find / -name conf -print & | ввод команды "find"| || 288 | номер (PID) фонового процесса| || $ pwd | ввод команды "pwd"| || /mnt/lab/asu | результат работы "pwd"| || $ | возвращение shell в промптер| || /usr/include/sys/conf | результат работы "find"| |--------------------------------Иногда необходимо, чтобы все фоновые процессы завершились, прежде чем будет выполняться какой-то расчет. Для этого служит специальная команда "wait [PID]". Эта команда ждет завершения указанного идентификатором (числом) фонового процесса. Если команда без параметра, то она ждет завершения всех фоновых процессов, дочерних для данного "sh".Для группировки команд также могут использоваться фигурные "{}" и круглые "()" скобки. Рассмотрим примеры, сочетающие различные способы группировки:Если введена командная строкаk1 && k2; k3где k1, k2 и k3 - какие-то команды, то "k2" будет выполнена только при успешном завершении "k1"; после любого из исходов обработки "k2" (т.е. "k2" будет выполнена, либо пропущена) будет выполнена "k3".k1 && {k2; k3}Здесь обе команды ("k2" и "k3") будут выполнены только при успешном завершении "k1".{k1; k2} &В фоновом режиме будет выполняться последовательность команд "k1" и "k2".Фоновые процессы (как и теневую экономику) сложно уничтожить, поскольку традиционная команда "CTL/C" прерывает только процессы переднего плана. Для уничтожения фонового процесса надо знать его номер. При запуске фонового процесса на экран выдается число, соответствующее номеру (идентификатору) этого процесса (PID). Если этот номер забыт или надо убедиться, что этот процесс не закончен, с помощью командыps -auxможно получить перечень идентификаторов процессов (PID), имена пользователей, текущее время, затраченное процессами, и т.д.В выведенной таблице можно найти номера процессов, подлежащих уничтожению, например это "849" и "866". Тогда командойkill -9 866 849можно уничтожить эти процессы. При уничтожении процессов надо вы должны иметь то же имя пользователя, какое было приписано уничтожаемым процессам (или иметь имя привилегированного пользователя).Если параллельно обрабатывается или создается файл с ОДНИМ именем (например, несколько пользователей вызвали в редактор один и тот же файл), то в системе продолжит существование тот вариант файла, который возвращен (записан) в систему последним. Это частая ошибка пользователей персональных компьютеров, которые редактируют один файл параллельно с нескольких экранов.Круглые скобки "()", кроме выполнения функции группировки, выполняют и функцию вызова нового экземпляра интерпретатора shell.Пусть мы находились в начальном каталоге "/mnt/lab/asu"Тогда в последовательности командcd ..; ls; lsдве команды "ls" выдадут 2 экземпляра содержимого каталога "/mnt/lab", а последовательность(cd ..; ls) lsвыдаст сначала содержимое каталога "/mnt/lab", а затем содержимое "/mnt/lab/asu", т.к. при входе в скобки вызывается новый экземпляр shell, в рамках которого и осуществляется переход. При выходе из круглых скобок происходит возврат в старый shell и в старый каталог.^Несмотря на то, что shell-переменные в общем случае воспринимаются как строки, т.е "35" - это не число, а строка из двух символов "3" и "5", в раде случаев они могут интерпретироваться иначе, например, как целые числа. Разнообразные возможности имеет команда "expr". Проиллюстрируем некоторые на примерах:Выполнение командного файла:x=7 y=2a=`expr $x + $y` ; echo a=$aa=`expr $a + 1` ; echo a=$ab=`expr $y - $x` ; echo b=$bc=`expr $x '*' $y` ; echo c=$cd=`expr $x / $y` ; echo d=$de=`expr $x % $y` ; echo e=$eвыдаст на экранa=9a=10b=-5c=14d=3e=1Операция умножения ("*") обязательно должна быть заэкранирована, поскольку в shell этот значек воспринимается, как спецсимвол, означающий, что на это место может быть подставлена любая последовательность символов. Следует обратить также внимание на обязательные пробелы, отделяющие переменные и знаки операций.С командой "expr" возможны не только (целочисленные) арифметические операции, но и строковые:A=`expr 'cocktail' : 'cock'` ; echo $AB=`expr 'cocktail' : 'tail'` ; echo $BC=`expr 'cocktail' : 'cook'` ; echo $CD=`expr 'cock' : 'cocktail'` ; echo $DНа экран будут выведены числа, показывающее число совпадающих символов в цепочках (от начала). Вторая из строк не может быть длиннее первой :4000И наконец, об условной замене переменныйх. Если переменные, скажем "х", "y", "z", не определены, то при обращении к переменным${x-new} - в качестве значения "x" будет выдано "new",${y=new} - в качестве значения "у" будет присвоено "new",${z?new} - в качестве значения "z" будет выдано "z: new" и соответствующая процедура прекращается.Во всех этих случаях, если переменная была к этому времени определена, то ее значение используется обычным образом.А в следующем случае наоборот, пусть переменная "v" имеет какое-то значение, тогда${z+new} - в качестве значения "z" будет выдано "new", а если не было присвоено значение, то пустая строка.^-f file - файл "file" является обычным файлом;-d file - файл "file" - каталог;-с file - файл "file" - специальный файл;-r file - имеется разрешение на чтение файла "file";-w file - имеется разрешение на запись в файл "file";-s file - файл "file" не пустой.Примеры. Вводя с клавиатуры командные строки в первом случае получим подтверждение (код завершения "0"), а во втором - опровержение (код завершения "1"). "specific" - имя существующего файла.[ -f specific ] ; echo $?0[ -d specific ] ; echo $?1^str1 = str2 - строки "str1" и "str2" совпадают;str1 != str2 - строки "str1" и "str2" не совпадают;-n str1 - строка "str1" существует (непустая);-z str1 строка "str1" не существует (пустая).Примеры.x="who is who"; export x; [ "who is who" = "$x" ]; echo $?0x=abc ; export x ; [ abc = "$x" ] ; echo $?0x=abc ; export x ; [ -n "$x" ] ; echo $?0x="" ; export x ; [ -n "$x" ] ; echo $?1^x -eq y - "x" равно "y",x -ne y - "x" неравно "y",x -gt y - "x" больше "y",x -ge y - "x" больше или равно "y",x -lt y - "x" меньше "y",x -le y - "x" меньше или равно "y".То есть в данном случае команда "test" воспринимает строки символов как целые (!) числа. Поэтому во всех остальных случаях "нулевому" значению соответствует пустая строка. В данном же случае, если надо обнулить переменную, скажем, "x", то это достигается присваиванием "x=0".Примеры.x=abc ; export x ; [ abc -eq "$x" ] ; echo $?"[": integer expression expected before -eqx=321 ; export x ; [ 321 -eq "$x" ] ; echo $?0x=3.21 ; export x ; [ 3.21 -eq "$x" ] ; echo $?"[": integer expression expected before -eqx=321 ; export x ; [ 123 -lt "$x" ] ; echo $?0^Цель лабораторной работы заключается в приобретении знаний и навыков работы на командном языке UNIX-подобных операционных систем – «Shell». Эта лабораторная работа поможет студентам сформировать взгляд на развитие современного математического обеспечения ЭВМ, путях его разработки и совершенствования; увидеть все преимущества и недостатки ОС UNIX в сравнении с другими операционными системами. ^Прежде чем приступить к выполнению лабораторной работы, необходимо познакомиться с выполнением системных вызовов и команд ОС UNIX ([1] - [5]). После этого целесообразно подготовить тексты программ. Перед выходом на ЭВМ желательно познакомиться с описанием команд одного из текстовых редакторов (EE, VI, ED, EDIT, NANO или др.) [2], [3], [4]. При известных идентификаторе и пароле, а также работающем терминале процедура входа в систему осуществляется в следующей последовательности: Установить связь между ЭВМ и Вашим терминалом. Для этого достаточно выполнить команду putty.exe c указанием IP адреса, номера порта и протокола обмена. После этого система ответит коротким простым сообщением: ИМЯ : Необходимо представить себя системе, т.е. вслед за подсказкой "ИМЯ"(“LOGIN:”) набрать с клавиатуры свой идентификатор и нажать клавишу ^ Ввести свой пароль (он не отображается на экране). При успешном выполнении этих операций на экране появится знак #, $ или %. Это сигнализирует об успешном входе в систему и является подсказкой интерпретатора shell (# - для привилегированного пользователя). Далее можно вводить любую команду системы, в частности, для ввода и редактирования текста, трансляции программы и т.п. Например, nano а - запись текста программы в файл а c помощью экранного редактора nano. После создания файла а и записи в него программы, можно приступать к его выполнению: #sh a где а - имя выходного загрузочного файла; ^ Пример 1: Задание: Написать программу определения типа файла, указанного при запросе. Полеченную информацию через файловую систему перевести в параллельный процесс, где вывести на печать. ^ #!/bin/bash ##chmod 0777 mave.sh n=0; name=" "; Cconst='C program text'; Cconst2='C++ program text'; if [ -e C.txt ] then rm C.txt fi echo $Cconst >> C.txt echo $Cconst2 >> C.txt case "$1" in "son") ls -l| awk '{print $1}'>info.txt ;; *) ./mave.sh son for name in `cat info.txt` do sleep 1 symbol=`echo $name | head -c 1` case $symbol in -) echo "обычный файл" ;; d) echo "каталог" ;; p) echo "Fifo файл" ;; c) echo "специальный файл" ;; esac done ;; esac Пример 2: Задание: Написать программу, осуществляющую трансляцию и выполнение файлов на языке программирования Си, имена которых вводятся по запросу. ^ #!/bin/bash clear file=null xy=ull while [ "$xy" != "n" ] do file=null echo -n "Введите имя файла:" read file w=$file".out" if [ ! -f "$file" ] then echo "$file не существует" echo "Завершение" fi echo echo "----------------" gcc -o $w $file && ./$w echo echo "----------------" xy=null echo -n "Хотите ввести имя файла:" read xy done ^
^
БИБЛИОГРАФИЧЕСКИЙ СПИСОК
Учебное издание ПРОГРАММИРОВАНИЕ В ОПЕРАЦИОННОЙ СРЕДЕ UNIX НА КОМАНДНОМ ЯЗЫКЕ «SHELL» Составители: САФОНОВА Ирина ЕвгеньевнаИСТРАТОВ Юрий Анатольевич |