|
Программирование на Shell
Среди операционных систем особое место
занимает Unix. Беспрецедентным является то, что ОС Unix может работать
практически на всех выпускаемых платформах. UNIX - это стандарт де факто
открытых и мобильных операционных систем. (поскольку название UNIX запатентовано
компанией AT&T - различные юниксы называются различно: SCO UNIX, BSDI,
Solaris, Linux, DG/UX, AIX и т.д.). Это не только многозадачная, но и
многопользовательская система. Она обеспечивает современный пользовательский
интерфейс на базе системы X Window и межмашинную связь на базе протоколов TCP/IP
и т.п. ОС Unix была создана Кеном Томпсоном и Деннисом Ритчи в Bell
Laborotories (AT&T). Широко распространяться Unix/v7 (версия 7) начала в 79
- 80-м годах. Вручение создателям Unix в 1983 году Международной премии
А.Тьюринга в области программирования ознаменовало признание этой системы
мировой научной (computer science) общественностью. Что также беспрецедентно.
ОС Unix стоит на трех китах: язык Си, файловая система, командный язык. В
дальнейшем к ним добавились система X Window и протоколы TCP/IP. (в переводе - раковина,
скорлупа) фактически есть язык программирования очень высокого уровня. На этом
языке пользователь осуществляет управление компьютером. Обычно, после входа в
систему вы начинаете взаимодействовать с командной оболочкой. Признаком того,
что оболочка ( $ не
является необходимым и единственным командным языком (хотя именно он
стандартизован в рамках , есть
также и другие. Более того, каждый пользователь
может создать свой командный язык. Может одновременно на одном экземпляре
операционной системы работать с разными командными языками. " входит команда " " вызывается автоматически при вашем входе в систему и
выдает на экран промтер. После этого вы можете вызывать на выполнение любые
команды, в том числе и снова сам " Так например, если вы подготовите в редакторе файл
" ", которая при выполнении выдает все написанное
правее ее на экран. Можно сделать файл " ". Но его можно выполнить, вызвав явно команду
" Файл можно выполнить и в текущем экземпляре " Поскольку UNIX - система многопользовательская, вы можете даже на
персональном компьютере работать параллельно, скажем, на 12-ти экранах (переход
с экрана на экран ALT/функциональная клавиша), имея на каждом экране нового (или
одного и того же) пользователя со своей командной оболочкой. Можете и в
графическом режиме X-Window также открыть большое число окон, а в каждом окне
может быть свой пользователь со своей командной оболочкой... обычно имеют следующий формат: - имя команды выдачи содержимого директория, /usr/bin Эта команда выдаст на экран в длинном формате содержимое
директория К сожалению, такая структура команды выдерживается далеко не
всегда. Не всегда перед флагами ставится минус, не всегда флаги идут одним
словом. Есть разнообразие и в представлении аргументов. К числу команд, имеющих
экзотические форматы, относятся и такие "ходовые" команды, как копирование
файла с преобразованием, воспринимает, как команду. Поэтому в
командной строке , как команда (конкатенации), которая выдаст на экран файл с именем
" асинхронное (фоновое) выполнение предшествующей команды; выполнение последующей команды при условии нормального завершения
предыдущей, иначе игнорировать; При выполнении команды
в асинхронном режиме (после команды стоит один амперсанд) на экран выводится
номер процесса, соответствующий выполняемой команде, и система, запустив этот
фоновый процесс, вновь выходит на диалог с пользователем. " в фоновом режиме для поиска в системе , начиная от корня
"/", файла с именем " " в обычном режиме. На
экране этот фрагмент будет выглядеть следующим образом (курсивом выделены
комментарии): ) фонового
процесса " Иногда необходимо, чтобы все фоновые процессы
завершились, прежде чем будет выполняться какой-то расчет. Для этого служит
специальная команда " ". Эта команда ждет завершения указанного
идентификатором (числом) фонового процесса. Если команда без параметра, то она
ждет завершения всех фоновых процессов, дочерних для данного " " скобки. Рассмотрим примеры, сочетающие различные способы
группировки: Если введена командная строка - какие-то
команды, то " "; после любого из исходов обработки " command1 && { command2; command3} command1 command1 " прерывает только процессы переднего плана. Для
уничтожения фонового процесса надо знать его номер. При запуске фонового
процесса на экран выдается число, соответствующее номеру (идентификатору) этого
процесса ( ps -aux ), имена пользователей, текущее
время, затраченное процессами, и т.д. ".
Тогда командой можно уничтожить эти процессы. При
уничтожении процессов надо вы должны иметь то же имя пользователя, какое было
приписано уничтожаемым процессам или root. ", кроме
выполнения функции группировки, выполняют и функцию вызова нового экземпляра
интерпретатора ", а последовательность /mnt/lab/asu , в рамках которого и осуществляется переход. При выходе из круглых
скобок происходит возврат в старый ОС
UNIX " направлен на экран терминала. Существует еще и стандартный файл
диагностических сообщений - " Команда, которая может работать со стандартным входом и выходом, называется
ФИЛЬТРОМ. " и " " сформирует список файлов текущего каталога и поместит его в файл
" сформирует полное имя текущего каталога и поместит его в конец файла
" " обозначают перенаправление ввода.
ed file_2 <<! ", непосредственно с терминала. Окончание ввода
определяется по символу, стоящему правее " ".
wc -l >file_4 <file_3 file_4 Средство, объединяющее стандартный выход одной команды со
стандартным входом другой, называется КОНВЕЙЕРОМ и обозначается вертикальной
чертой " ", которая на экран выведет число строк
каталога. cat file_1 grep -h result
sort cat -b > file_2 "
(" ") и выведет результат в файл " представлены специальными файлами, их
можно использовать при перенаправлениях. Специальные файлы находятся в каталоге
" -ый терминал; " выведет содержимое текущего каталога на печать, а В этом случае будет отсортирован файл " Вернемся
к перенаправлению выхода. Стандартные файлы имеют номера: Если вам не желательно иметь на экране
сообщение об ошибке, вы можете перенаправить его с экрана в указанный вами файл
(или вообще "выбросить", перенаправив в файл "пустого устройства" - /dev/null).
Например при выполнении команды file_2 где 111111 222222 - содержимое файла
" "
выдала сообщение в стандартный файл диагностики, по умолчанию, как и стандартный
выход, представленный экраном. cat file_1 file_2
2>f-err ". Кстати, вы можете всю
информацию направлять в один файл " Можно указать не
только какой из стандартных файлов перенаправлять, но и в какой стандартный файл
осуществить перенаправление. " перенаправляется (в режиме
добавления) в файл "ff", а затем стандартный выход перенаправляется на
" Конструкция " " -
означает, что кроме номера стандартного файла, в который перенаправить,
необходимо впереди ставить " Для
того, чтобы текстовый файл можно было использовать как команду, существует
несколько возможностей. date; pwd;
ls ", как аргумент или как перенаправленный вход, т.е.
В результате выполнения
любой из этих команд будет выдана дата, затем имя текущего каталога, а потом
содержимое каталога. Более интересный и удобный вариант работы с командным
файлом - это превратить его в выполняемый, т.е. просто сделать его командой, что
достигается изменением кода защиты. Для этого надо разрешить выполнение этого
файла. приведет к выполнению тех же
трех команд. ls Таким
образом, выполняемыми файлами могут быть не только файлы, полученные в
результате компиляции и сборки, но и файлы, написанные на языке используются два механизма отладки командных файлов. выводит строки командного файла по мере их чтения. Этот режим
применяется при поиске синтаксических ошибок. Для его использования не требуется
производить модификацию командного файла, например: может
использоваться вместе с ключом блокирует терминал до тех пор, пока не
вводится признак конца файла выводит команды
по мере их выполнения, причём на терминал выводятся строки программы и на место
переменных подставляются их значения. Для отмены ключей а для установки - присвоить
соответствующее значение макропеременной. можно писать командные
файлы и с помощью команды " -переменной - это
начинающаяся с буквы последовательность букв, цифр и подчеркиваний. всего два
типа данных: строка символов и текстовый файл, с одной стороны, позволяет легко
вовлекать в программирование конечных пользователей, никогда ранее
программированием не занимавшихся, а с другой стороны, вызывает некий внутренний
протест у многих программистов, привыкших к существенно большему разнообразию и
большей гибкости языковых средств. , пишут
на нем программы вомного раз быстрее, чем на Си, но, что особенно интересно, в
ряде случаев эти программы работают даже быстрее, чем реализованные на Си. Имя
переменной аналогично традиционному представлению об идентификаторе, т.е. именем
может быть последовательность букв, цифр и подчеркиваний, начинающаяся с буквы
или подчеркивания. - "13" - это не число, а
строка из двух цифр. Возможны и иные способы
присваивания значений приводит к тому, что сначала выполняется команда " "
(обратные кавычки говорят о том, что сначала должна быть выполнена заключенная в
них команда), а результат ее выполнения, вместо выдачи на стандартный выход,
приписывается в качестве значения переменной, в данном случае " ",
которая обеспечивает прием значения переменной с (клавиатуры) дисплея в
диалоговом режиме. Обычно команде " ", которая позволяет предварительно выдать какое-то
сообщение на экран. Например: При выполнении этого фрагмента командного файла, после вывода на
экран сообщения интерпретатор
остановится и будет ждать ввода значения с клавиатуры. Если вы ввели, скажем,
" " может прочитать (присвоить) значения сразу для нескольких
переменных. Если переменных в " " больше, чем их введено (через
пробелы), оставшимся присваивается пустая строка. Если передаваемых значений
больше, чем переменных в команде " -переменной необходимо перед именем ставить символ
" shell ) и бэк-слэш ( x=22
y=33 z=$x не было бы выполнено из-за
пробелов) eval echo evaluated B = $B D = 22 +
33 + 22 E = $x + $y + $z F = 22 + 33 + 22 Приведем еще примеры, связанные с экранированием
перевода строки. Пусть переменной " Обратим внимание, что для избежания присваивания
лишних пробелов вторая строка массива начата с первой позиции следующей строки:
echo '$string' а последовательность команд даст выдаст последовательно одинаковые файлы Заметим также, что бэк-
слэш (\) не только экранирует следующий за ним символ, что позволяет
использовать специальные символы просто как символы, представляющие сами себя
(он может экранировать и сам себя - \\), но в командном файле бэк-слэш позволяет
об'единять строки в одну (экранировать конец строки). cat file_1 grep -h result sort cat -b
> file_2 result sort cat -b > file_2 Кстати, эффект
продолжения командной строки обеспечивает и символ конвейера. В данном случае
это может дать более симпатичный результат, например: 3.3.
Манипуляции с shell-переменными " - это не число, а
строка из двух символов " Разнообразные
возможности имеет команда " a=`expr $x + $y` ;
echo a=$a d=`expr $x / $y` ; echo d=$d Операция умножения (" этот значок воспринимается, как
спецсимвол, означающий, что на это место может быть подставлена любая
последовательность символов. A=`expr
'cocktail' : 'cock'` ; echo $A D=`expr 'cock' : 'cocktail'` ; echo
$D На экран будут выведены числа, показывающее число совпадающих символов
в цепочках (от начала). Вторая из строк не может быть длиннее первой : существует понятие процесса. Процесс возникает тогда, когда
запускается на выполнение какая-либо команда. р ", которые последовательно порождают
соответствующие процессы. " уже существовала
среда, в которой уже были определены некоторые переменные. Запуск " Переменные локальны в рамках процесса, в котором они объявлены, т.е. где им
присвоены значения. Для того, чтобы они были доступны и другим порождаемым
процессам, надо передать их явным образом. Для этого используется встроенная
команда " shell используются
позиционные параметры (т.е. существенна очередность их следования). В командном
файле соответствующие параметрам переменные (аналогично Пусть " ". Эти параметры попадают в новую среду под стандартными именами
" При обращении к параметрам перед цифрой
ставится символ доллара " $0 второй
параметр и т.д. Поскольку число переменных, в которые могут
передаваться параметры, ограничено одной цифрой, т.е. ",
как уже отмечалось имеет особый смысл), то для передачи большего числа
параметров используется специальная команда " set
a b с set "
выдает на экран текущую дату, скажем, "Mon May 01 12:15:10 2000", состоящую из
пяти слов, тогда " позволяет также осуществлять контроль
выполнения программы, например: на
терминал выводятся строки, читаемые shell. set 3.6.
Подстановки shell-интерпретатора Перед началом непосредственной интерпретации
и выполнением команд, содержащихся в командных файлах, shell выполняет различные
виды подстановок: Выполняются все команды,
заключенные в обратные кавычки, и на их место подставляется результат.
То есть слова,
начинающиеся на "$", заменяются соответствующими значениями переменных и
параметров. Проверяются слова на наличие в
них спецсимволов ("*", "?","[]") и выполняются соответствующие генерации. Каждый процесс имеет среду, в
которой он выполняется. Shell использует ряд переменных этой среды. Если вы
наберете команду "set" без параметров, то на экран будет выдана информация о
ряде стандартных переменных, созданных при входе в систему (и передаваемых далее
всем вашим новым процессам "по наследству"), а также переменных, созданных и
экспортируемых вашими процессами. Конкретный вид и содержание выдаваемой
информации в немалой степени зависит от того, какая версия UNIX используется и
как инсталлирована система.
PATH=/usr/local/bin:/usr/bin:/bin:.:/usr/bin/X11: SHELL=/bin/bash - это имя домашнего директория, в котором пользователь
оказывается после входа в систему. То есть, правильно набрав имя и пароль, я
окажусь в директории
" - эта
переменная задает последовательность файлов, которые просматривает
" " в поисках команды. Имена файлов разделяются здесь двоеточиями.
Последовательность просмотра соответствует очередности следования имен в тропе.
Но первоначально поиск происходит среди так называемых встроенных команд. В
число встроенных команд входят наиболее часто используемые команды, например
" ", в котором могут находиться команды
" ", " " и многими другими. Далее поиск происходит в текущем
директории (".", или другое обозначение "пусто", т.е.""), где скорее всего
находятся написанные вами команды. " (после выполнения необходимых подстановок)
распознает имя, соответствующее команде и осуществляет ее поиск в директориях,
перечисленных в . Если команда размещена вне этих директориев, она не
будет найдена. Если присутствует несколько команд с одинаковым именем, то
вызвана будет та, которая расположена в директории, просматриваемом
первым. IFS= (Внутренний Разделитель
Полей) перечисляет символы, которые служат для разделения слов (полей). Таковыми
являются "пробел", "табуляция" и "перевод строки", поэтому здесь слева от
присваивания ничего не видно и занято две строки. имя файла, в
который поступает (электронная) почта. вид промтера. В данном случае в промптере
будет выдаваться имя текущего директория двоеточие и пробел. То есть здесь будет
" этот промтер (здесь ">") используется
как приглашение к продолжению ввода (в очередной строке) незаконченной команды.
Например, наберите открывающую скобку "(" и после нажатия <Enter> в
следующей строке вы увидите этот промптер. Если пока не знаете, что дальше
делать, наберите закрывающую скобку ")" и он исчезнет. эта переменная указывает оболочку, которую использует пользователь. В данном
случае используется стандартный Исходная среда
устанавливается автоматически при входе в систему с использованием файлов типа
"/etc/rc" и "/etc/.profile". Один из способов просто изменит среду (например,
тропу поиска команд, вид промтера, вид оболочки, цвет экрана и т.п.) можно,
разместив эту информацию в своем домашнем директории в специализированном файле
" ), присвоив нужные значения переменным
среды. То есть вызвать это файл в редактор и написать, что пожелаете). Тогда при
каждом вашем входе в систему этот файл будет автоматически выполняться и
устанавливать новую среду. Этот файл должен ОБЯЗАТЕЛЬНО размещаться в вашем
ДОМАШНЕМ директории (директории входа). Следует иметь в виду, что имена
файлов, начинающиеся с точки, вообще имеют особый статус. Так, они не выдаются
на экран простой командой " rm * значение, возвращенное последней
командой; число позиционных параметров, передаваемых в shell;
При обращении к этим переменным (т.е при
использовании их в командном файле - shell-программе) следует впереди ставить
"$". Важную роль при создании уникальных файлов играет специальная переменная
"$$", значение которой соответствует номеру процесса, выполняющего данный
расчет. Каждый новый расчет, выполняемый компьютером, инициирует один или
несколько процессов, автоматически получающих номера по порядку. Поэтому,
используя номер процесса в качестве имени файла, можно быть уверенным, что
каждый новый файл будет иметь новое имя (не запишется на место уже
существующего). Достоинство является и главным недостатком такого способа
именования файлов. Неизвестно, какие имена будут присвоены файлам. И, если в
рамках данного процесса можно найти файл "не глядя", т.е., обратившись к нему,
используя $$, то потом такие файлы можно легко потерять. Это создает
дополнительные проблемы при отладке программ. )
вызывается интерпретатор языка , то прежде чем с терминала будет
принята хотя бы одна команда, интерпретатор выполняет этот файл
(подразумевается, что файл . Команды считываются
из заданной Команды читаются из стандартного
файла ввода. Сообщения интерпретатора записываются в стандартный файл
диагностик. , то команды считываются из файла
. Как
во всяком языке программирования в тексте на языке shell могут быть комментарии.
Для этого используется символ "#". Все, что находится в строке (в командном
файле) левее этого символа, воспринимается интерпретатором как комментарий.
Например, Как во всяком процедурном языке
программирования в языке shell есть операторы. Ряд операторов позволяет
управлять последовательностью выполнения команд. В таких операторах часто
необходима проверка условия, которая и определяет направление продолжения
вычислений. проверяет выполнение некоторого условия. С использованием этой
(встроенной) команды формируются операторы выбора и цикла языка мы будем пользоваться вторым вариантом, т.е. вместо того, чтобы
писать перед условием слово " будет
распознавать эту команду по открывающей скобке " ". Между скобками и содержащимся в них
условием обязательно должны быть пробелы. используются
условия различных "типов". файл
"file" - специальный файл; имеется разрешение на чтение файла "file";
имеется
разрешение на запись в файл "file"; x="who is who"; export
x; [ "who is who" = "$x" ]; echo $? x="" ; export x
; [ -n "$x" ] ; echo $? Кроме того, существуют два стандартных
значения условия, которые могут использоваться вместо условия (для этого не
нужны скобки). x -eq y "x" неравно "y", "x" меньше или равно "y".
(not) инвертирует значение кода
завершения. условие Здесь " " может быть использован наряду с полным, т.е. допускается
вложение произвольного числа операторов "if" (как и других операторов).
Разумеется "список" в каждом случае должен быть осмысленный и допустимый в
данном контексте. если выполнено условие (как правило
это ком получен код завершения "0", то выполняется "список", иначе он
пропускается. Тогда вызов строка Здесь " " -
служебные слова. "Строка" (это может быть и один символ) сравнивается с
"шаблоном". Затем выполняется "список команд" выбранной строки. Непривычно
выглядят в конце строк выбора ";;", но написать здесь ";" было бы ошибкой. Для
каждой альтернативы может быть выполнено несколько команд. Если эти команды
будут записаны в одну строку, то символ ";" будет использоваться как разделитель
команд. Обычно последняя строка выбора имеет шаблон "*", что в структуре
"case" означает "любое значение". Эта строка выбирается, если не произошло
совпадение значения переменной (здесь $z) ни с одним из ранее записанных
шаблонов, ограниченных скобкой ")". Значения просматриваются в порядке записи.
in " - служебное слово определяющее
тип цикла, Пусть команда "lsort" представлена командным файлом " играет роль параметра цикла. Это имя можно рассматривать как
, ", означающая "для всех файлов текущего каталога". cat $1
sort tee /dev/lp > ${1}_sorted ") и
направляются в файлы 4.5. Оператор цикла с истинным условием ("while")
", также обеспечивающая выполнение расчетов,
предпочтительнее тогда, когда неизвестен заранее точный список значений
параметров или этот список должен быть получен в результате вычислений в цикле.
" - служебное слово
определяющее тип цикла с истинным условием. Список команд в теле цикла (между
" ") повторяется до тех пор, пока сохраняется истинность
условия (т.е. код завершения последней команды в теле цикла равен " exit " позволяет выходить из цикла. Если
" "
указывает число вложенных циклов, из которых надо выйти, например, " " лишь прекращает выполнение текущего цикла и
возвращает на НАЧАЛО цикла. Она также может быть с параметром. Например,
" exit [n] "
указан). Эта команда может использоваться не только в циклах. Даже в линейной
последовательности команд она может быть полезна при отладке, чтобы прекратит
выполнение (текущего) расчета в заданной точке. условие " - служебное слово определяющее тип цикла с ложным условием.
Список команд в теле цикла (между " ") повторяется до
тех пор, пока сохраняется ложность условия или цикл не будет прерван изнутри
специальными командами (" Отличие от оператора
"while" состоит в том, что условие цикла проверяется на ложность (на ненулевой
код завершения последней команды тела цикла) проверяется ПОСЛЕ каждого (в том
числе и первого!) выполнения команд тела цикла. fi "), пока не будет введено " Ничего не делает. Возвращает значение
"0".". Функция позволяет
подготовить список команд shell для последующего выполнения. после чего обращение к
функции происходит по имени. При выполнении функции не создается нового
процесса. Она выполняется в среде соответствующего процесса. Аргументы функции
становятся ее позиционными параметрами; имя функции - ее нулевой параметр.
Прервать выполнение функции можно оператором " 4.9.
Обработка прерываний ("trap") Наиболее часто приходится встречаться со следующими
прерываниями, соответствующими сигналам: выход из
интерпретатора, 9 ", имеющая формат: Если в системе возникнут прерывания, чьи сигналы
перечислены через пробел в "сигналы", то будет выполнен "список команд", после
чего (если в списке команд не была выполнена команда " Например, если перед прекращением по прерываниям выполнения какого то
командного файла необходимо удалить файлы в " которая предшествует прочим командам файла. Здесь, после удаления
файлов будет осуществлен выход "
| |